--- /dev/null
+Makefile
+Makefile.in
+aclocal.m4
+autom4te.cache
+babl.pc
+config.cache
+config.guess
+config.h
+config.h.in
+config.log
+config.status
+config.sub
+configure
+libtool
+ltmain.sh
+stamp-h
+stamp-h1
+stamp-h.in
+
--- /dev/null
+Øyvind Kolås
--- /dev/null
+ GNU LIBRARY GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the library GPL. It is
+ numbered 2 because it goes with version 2 of the ordinary GPL.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Library General Public License, applies to some
+specially designated Free Software Foundation software, and to any
+other libraries whose authors decide to use it. You can use it for
+your libraries, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if
+you distribute copies of the library, or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link a program with the library, you must provide
+complete object files to the recipients so that they can relink them
+with the library, after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ Our method of protecting your rights has two steps: (1) copyright
+the library, and (2) offer you this license which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ Also, for each distributor's protection, we want to make certain
+that everyone understands that there is no warranty for this free
+library. If the library is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original
+version, so that any problems introduced by others will not reflect on
+the original authors' reputations.
+\f
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that companies distributing free
+software will individually obtain patent licenses, thus in effect
+transforming the program into proprietary software. To prevent this,
+we have made it clear that any patent must be licensed for everyone's
+free use or not licensed at all.
+
+ Most GNU software, including some libraries, is covered by the ordinary
+GNU General Public License, which was designed for utility programs. This
+license, the GNU Library General Public License, applies to certain
+designated libraries. This license is quite different from the ordinary
+one; be sure to read it in full, and don't assume that anything in it is
+the same as in the ordinary license.
+
+ The reason we have a separate public license for some libraries is that
+they blur the distinction we usually make between modifying or adding to a
+program and simply using it. Linking a program with a library, without
+changing the library, is in some sense simply using the library, and is
+analogous to running a utility program or application program. However, in
+a textual and legal sense, the linked executable is a combined work, a
+derivative of the original library, and the ordinary General Public License
+treats it as such.
+
+ Because of this blurred distinction, using the ordinary General
+Public License for libraries did not effectively promote software
+sharing, because most developers did not use the libraries. We
+concluded that weaker conditions might promote sharing better.
+
+ However, unrestricted linking of non-free programs would deprive the
+users of those programs of all benefit from the free status of the
+libraries themselves. This Library General Public License is intended to
+permit developers of non-free programs to use free libraries, while
+preserving your freedom as a user of such programs to change the free
+libraries that are incorporated in them. (We have not seen how to achieve
+this as regards changes in header files, but we have achieved it as regards
+changes in the actual functions of the Library.) The hope is that this
+will lead to faster development of free libraries.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, while the latter only
+works together with the library.
+
+ Note that it is possible for a library to be covered by the ordinary
+General Public License rather than by this special one.
+\f
+ GNU LIBRARY GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library which
+contains a notice placed by the copyright holder or other authorized
+party saying it may be distributed under the terms of this Library
+General Public License (also called "this License"). Each licensee is
+addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+\f
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+\f
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+\f
+ 6. As an exception to the Sections above, you may also compile or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ c) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ d) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the source code distributed need not include anything that is normally
+distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+\f
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+\f
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Library General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+\f
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+\f
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this library; if not, write to the
+ Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
--- /dev/null
+2005-08-09 Øyvind Kolås <pippin@gimp.org>
+
+ Imported into GNOME CVS.
+
+2005-08-09 Øyvind Kolås <pippin@gimp.org>
+
+ - seperate babl-base into separate subdir.
+
+2005-08-09 Øyvind Kolås <pippin@gimp.org>
+
+ - Renamed class to model.
+ - Auto toolification
+
+2005-08-08 Øyvind Kolås <pippin@gimp.org>
+
+ - Completed data model
+ - Added sanity checker
+
+2005-08-07 Øyvind Kolås <pippin@gimp.org>
+
+ - Introspection
+
+2005-08-05 Øyvind Kolås <pippin@gimp.org>
+
+ - Initial ChangeLog
+
+2005-07-31 Øyvind Kolås <pippin@gimp.org>
+
+ - Type system
+
+2005-07-29 Øyvind Kolås <pippin@gimp.org>
+
+ - Babl's inception in the 'Chaos Village' at WhatTheHack.
+
--- /dev/null
+
+Babl @BABL_VERSION@
+
+ Dynamic; any to any, pixel format conversion library.
+
+-----------------------------------------------------------------------
+
+Installation instructions:
+--------------------------
+
+From a released version the following is the expected method of
+installation (or a variation on this theme):
+
+ ------------------------------------------------------------
+ foo$ wget http://pippin.gimp.org/babl/files/old/babl-@BABL_VERSION@.tar.gz
+ foo$ tar xzf babl-@BABL_VERSION@.tar.gz
+ foo$ cd babl-@BABL_VERSION@
+ foo/babl-@BABL_VERSION@$ ./configure && make && sudo make install
+ ------------------------------------------------------------
+
+
--- /dev/null
+# Minimal makefile to test that babl compiles, and for running
+# introspection/sanity tests, will not build an actual library
+
+all:
+ make -f Makefile-mini -C babl ../tests/nop
+ tests/nop
+introspect:
+ make -f Makefile-mini -C babl ../tests/introspect
+ tests/introspect
+clean:
+ make -f Makefile-mini -C babl clean
--- /dev/null
+AUTOMAKE_OPTIONS = foreign
+
+SUBDIRS= babl \
+ tests
+
+
+DIST_SUBDIRS = babl \
+ tests
+
+pkgconfigdir = $(libdir)/pkgconfig
+pkgconfig_DATA = babl.pc
+
+EXTRA_DIST = \
+ .cvsignore \
+ COPYING \
+ ChangeLog \
+ README.in \
+ INSTALL.in \
+ NEWS \
+ babl.pc.in \
+ autogen.sh \
+ Makefile-mini
+
+BUILT_EXTRA_DIST = \
+ README \
+ babl.pc
+
+.PHONY: snapshot
+
+snapshot:
+ $(MAKE) dist distdir=$(PACKAGE)-`date +"%Y%m%d"`
--- /dev/null
+babl-0.0.1:
+
+Initial public release of babl, minimal working configuration for
+RGB, CMYK and YCbCr for 8bit 16bit float and double. Emphasis is on
+precision and clarity of code not speed.
--- /dev/null
+
+Babl @BABL_VERSION@
+
+ Dynamic; any to any, pixel format conversion library.
+
+-----------------------------------------------------------------------
+
+
+General Information
+===================
+
+This is babl version @BABL_VERSION@, babl is a pixel format conversion
+library the provides conversions to and from any formats.
+
+The official web site is:
+ http://pippin.gimp.org/babl/
+
+
+Installation
+============
+
+See the file 'INSTALL'
+
+
+Current features
+================
+
+Bootstrapping with a reference conversions (to be used later for
+regression tests during development of optimized versions.)
+
+Data types (using "double" as common translation type):
+
+ "u8" unsigned 8bit
+ "u16" unsigned 16bit
+ "float" 32bit floating point
+ "double" 64bit floating point
+
+Color models (using "rgba" as common translation type):
+
+ "rgb" color
+ "rgba" color+alpha
+ "rgbA" color with premultiplied alpha
+ "srgb" Gamma corrected "rgb"
+ "srgba" Gamma corrected "rgb" with linear alpha
+ "g" grayscale
+ "ga" grayscale+alpha
+ "gA" grayscale with premultiplied alpha
+ "ycbcr" Luminance and chrominances (common in video world)
+ "ycbcra" Luminance chromninances and alpha.
+
+Sampling factors:
+
+ (1,1) Full sampling
+ (2,1) Half horizontal sampling
+ (2,1) Quartersize horizontal sampling
+ (1,2) Half vertical sampling
+ (2,2) Half resolution sampling
+ (4,4) Quartersize sampling
+
+ The sampling factors can be used to implement chroma subsampling:
+
+ YCbCr Y Cb Cr
+ --------+-------------------
+ 4:4:4 (1,1) (1,1) (1,1)
+ 4:2:2 (1,1) (2,1) (2,1)
+ 4:1:1 (1,1) (4,1) (4,1)
+ 4:2:0 (1,1) (2,2) (2,2)
+
+Pixel Formats:
+
+ (Any format allowed by the models and types can be specified,
+ the following are named for easy reference.)
+
+ "srgb" 8bit gamma corrected image with linear alpha
+ "srgba" used for instance for PNG files.
+
+ "rgb_float" Floating point buffer, good choice for
+ "rgba_float" prototyping image processing code before
+ optimizing using other pixel formats.
+
+ "lab_float" A representation useful for calculations that
+ "laba_float" prefers to work in a perceptually uniform color
+ space (note that lab is not perceptually
+ uniform, but closer than most others, /CIE lab/
+ is used extensively in color science, and many
+ approaches to color difference are based in
+ this color model.)
+
+ "yuv420" Video based format, often used with codecs for
+ instance communicating with libavcodec from the
+ ffmpeg project.
+
+ "cmyk_float" A floating point cmyk buffer based directly on
+ "cmyka_float" linear RGB.
+
+ cyan = (1.0-r) - min(1.0-r, 1.0-g, 1.0-b)
+ yellow = (1.0-r) - min(1.0-r, 1.0-g, 1.0-b)
+ magenta = (1.0-r) - min(1.0-r, 1.0-g, 1.0-b)
+
+
+Introspection
+=============
+
+Dumpig of the babl's internal state for debugging purposes.
+
+
+Sanity checking
+===============
+
+Babl will complain verbosely if any of the registered data types or
+color models do not have sufficient reference conversions to be
+regression tested properly.
+
+
+Planned features
+================
+
+- Regression testing against double based reference implementation for
+ development of optimized conversions.
+
+- Dynamically loaded modules with additional color models, data types,
+ pixel formats and conversions.
+
+- Compile time, and maybe runtime, profiling of conversions.
+
+- Conversion auto builder (BablFish) capable of finding the fastest path
+ through the set of registered conversions to perform a specified
+ conversion without precision loss.
+
+
--- /dev/null
+#! /bin/sh
+
+# $Id$
+#
+# Copyright (c) 2002 Daniel Elstner <daniel.elstner@gmx.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License VERSION 2 as
+# published by the Free Software Foundation. You are not allowed to
+# use any other version of the license; unless you got the explicit
+# permission from the author to do so.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+dir=`echo "$0" | sed 's,[^/]*$,,'`
+test "x${dir}" = "x" && dir='.'
+
+if test "x`cd "${dir}" 2>/dev/null && pwd`" != "x`pwd`"
+then
+ echo "This script must be executed directly from the source directory."
+ exit 1
+fi
+
+rm -f config.cache acconfig.h
+
+echo "- libtoolize." && \
+libtoolize --force && \
+echo "- aclocal." && \
+aclocal && \
+echo "- autoconf." && \
+autoconf && \
+echo "- autoheader." && \
+autoheader && \
+echo "- automake." && \
+automake --add-missing --gnu && \
+echo && \
+./configure "$@" && exit 0
+
+exit 1
+
--- /dev/null
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: babl
+Description: Dynamic; any to any, pixel format conversion library
+Version: @VERSION@
+Libs: -L${libdir} -lbabl
+Cflags: -I${includedir}/babl
+
--- /dev/null
+Makefile
+Makefile.in
+.deps
+*.lo
+*.la
+.libs
--- /dev/null
+# This makeile is used for more rapid test compilations than
+# autofoo allows, it will not build a usable libray though.
+
+default: clean all
+
+TARGETS = \
+ ../tests/nop \
+ ../tests/introspect
+
+CFLAGS = -Wall -g -O1 -I./babl-base -I. -I..
+
+BABL_OBJECTS= \
+ babl.o \
+ babl-base/babl-base.o \
+ babl-base/babl-base-types.o \
+ babl-base/babl-base-components.o \
+ babl-base/babl-base-conversions.o \
+ babl-base/babl-base-conversions-type.o \
+ babl-base/babl-base-conversions-model.o \
+ babl-base/babl-base-models.o \
+ babl-base/babl-base-pixel-formats.o \
+ babl-classes.o \
+ babl-component.o \
+ babl-conversion.o \
+ babl-fish.o \
+ babl-introspect.o \
+ babl-memory.o \
+ babl-model.o \
+ babl-pixel-format.o \
+ babl-sampling.o \
+ babl-sanity.o \
+ babl-type.o \
+ babl-util.o \
+
+
+../tests/nop: ../tests/nop.c $(BABL_OBJECTS)
+ gcc -o $@ $< $(BABL_OBJECTS) -I../babl/
+
+../tests/introspect: ../tests/introspect.c $(BABL_OBJECTS)
+ gcc -o $@ $< $(BABL_OBJECTS) -I../babl/
+
+clean:
+ rm -f $(TARGETS) $(BABL_OBJECTS) ../*~ ../*/*~ ../*/*~
+
--- /dev/null
+## Source directory
+
+SUBDIRS = babl-base
+
+c_sources = \
+ babl.c \
+ babl-classes.c \
+ babl-component.c \
+ babl-conversion.c \
+ babl-fish.c \
+ babl-introspect.c \
+ babl-memory.c \
+ babl-model.c \
+ babl-pixel-format.c \
+ babl-sampling.c \
+ babl-sanity.c \
+ babl-type.c \
+ babl-util.c
+
+h_sources = \
+ babl-classes.h \
+ babl-component.h \
+ babl-conversion.h \
+ babl-db.h \
+ babl-ids.h \
+ babl-internal.h \
+ babl-introspect.h \
+ babl-fish.h \
+ babl-memory.h \
+ babl-model.h \
+ babl-pixel-format.h \
+ babl-sampling.h \
+ babl-sanity.h \
+ babl-type.h \
+ babl-util.h \
+ babl.h
+
+library_includedir=$(includedir)/babl-$(BABL_API_VERSION)/babl
+library_include_HEADERS = \
+ babl.h \
+ babl-classes.h \
+ babl-component.h \
+ babl-conversion.h \
+ babl-fish.h \
+ babl-model.h \
+ babl-pixel-format.h \
+ babl-sampling.h \
+ babl-type.h
+
+INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/babl/babl-base
+
+lib_LTLIBRARIES= libbabl.la
+libbabl_la_SOURCES= $(h_sources) $(c_sources)
+libbabl_la_LIBADD=\
+ babl-base/libbabl_base.la
+
+libbabl_la_LDFLAGS= \
+ -version-info $(BABL_LIBRARY_VERSION) \
+ -release $(BABL_RELEASE)
+
+EXTRA_DIST := $(wildcard *.h) \
+ .cvsignore \
+ Makefile-mini
+
--- /dev/null
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "babl-classes.h"
+
+static const char *class_names[] =
+ {
+ "BablInstance",
+ "BablType",
+ "BablSampling",
+ "BablComponent",
+ "BablModel",
+ "BablPixelFormat",
+ "BablConversion",
+ "BablConversionType",
+ "BablConversionTypePlanar",
+ "BablConversionModelPlanar",
+ "BablConversionPixelFormatPlanar",
+ "BablConversionPixelFormatPlanar",
+ "BablFish",
+ "BablCeiling"
+ };
+
+const char *
+babl_class_name (BablClassType klass)
+{
+ return class_names[klass-BABL_INSTANCE];
+}
+
+int babl_hmpf_on_name_lookups = 1;
+
--- /dev/null
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef _BABL_CLASSES_H
+#define _BABL_CLASSES_H
+
+#ifdef BABL_SKETCHPAD
+
+BablClassType
+ BablInstance
+ BablType
+ BablSampling
+ BablComponent
+ BablModel
+ BablPixelFormat
+ BablConversion
+ BablConversionType
+ BablConversionTypePlanar
+ BablConversionModelPlanar
+ BablConversionPixelFormat
+ BablConversionPixelFormatPlanar
+
+maybe it could make sense to split model into the following, where
+the current model would live on in the component model,.
+ BablModelType
+ BablModelSampling
+ BablModelComponent
+
+ BablConversionModelType
+ BablConversionModelSampling
+ BablConversionModelComponent
+#endif
+
+/* Type and PixelFormat */
+typedef void (*BablFuncLinear) (void *src,
+ void *dst,
+ int n);
+
+/* TypePlanar, ModelPlanar and PixelFormatPlanar */
+typedef void (*BablFuncPlanar) (int src_bands,
+ void *src[],
+ int src_pitch[],
+ int dst_bands,
+ void *dst[],
+ int dst_pitch[],
+ int n);
+
+typedef void (*BablFuncPlanarBit) (int src_bands,
+ void *src[],
+ int src_bit[],
+ int src_pitch[],
+ int src_bit_pitch[],
+ int dst_bands,
+ void *dst[],
+ int dst_bit[],
+ int dst_pitch[],
+ int dst_bit_pitch[],
+ int n);
+
+typedef enum {
+ BABL_INSTANCE = 0xBAB10000,
+ BABL_TYPE,
+ BABL_SAMPLING,
+ BABL_COMPONENT,
+ BABL_MODEL,
+ BABL_PIXEL_FORMAT,
+
+ BABL_CONVERSION,
+ BABL_CONVERSION_TYPE,
+ BABL_CONVERSION_TYPE_PLANAR,
+ BABL_CONVERSION_MODEL_PLANAR,
+ BABL_CONVERSION_PIXEL_FORMAT,
+ BABL_CONVERSION_PIXEL_FORMAT_PLANAR,
+
+ BABL_FISH,
+
+ BABL_SKY
+} BablClassType;
+
+#define BABL_CLASS_TYPE_IS_VALID(klass_type) \
+ ( ((klass_type)>=BABL_INSTANCE ) && ((klass_type)<=BABL_SKY) ?1:0 )
+
+/* common header for any item inserted into database */
+typedef struct
+{
+ BablClassType type;
+ int id; /*< a numerical id, look at 'babl-ids.h' for the reserved
+ ones */
+ char *name; /*< the name this type exists under */
+} BablInstance;
+
+typedef struct
+{
+ BablInstance instance;
+ union Babl *source;
+ union Babl *destination;
+ int time_cost;
+ int loss;
+ union
+ {
+ BablFuncLinear linear;
+ BablFuncPlanar planar;
+ BablFuncPlanarBit planar_bit;
+ } function;
+} BablConversion;
+
+typedef struct
+{
+ BablConversion conversion;
+} BablConversionType;
+
+typedef struct
+{
+ BablConversion conversion;
+} BablConversionTypePlanar;
+
+typedef struct
+{
+ BablConversion conversion;
+} BablConversionModelPlanar;
+
+typedef struct
+{
+ BablConversion conversion;
+} BablConversionPixelFormat;
+
+typedef struct
+{
+ BablConversion conversion;
+} BablConversionPixelFormatPlanar;
+
+typedef struct
+{
+ BablInstance instance;
+ BablConversion **from; /*< NULL terminated list of conversions from class */
+ BablConversion **to; /*< NULL terminated list of conversions to class */
+ int bits; /*< number of bits used to represent the data type
+ (initially restricted to a multiple of 8) */
+} BablType;
+
+typedef struct
+{
+ BablInstance instance;
+ BablConversion **from; /*< NULL terminated list of conversions from class */
+ BablConversion **to; /*< NULL terminated list of conversions to class */
+ int horizontal;
+ int vertical;
+} BablSampling;
+
+typedef struct
+{
+ BablInstance instance;
+ BablConversion **from; /*< NULL terminated list of conversions from class */
+ BablConversion **to; /*< NULL terminated list of conversions to class */
+ int luma;
+ int chroma;
+ int alpha;
+} BablComponent;
+
+
+typedef struct
+{
+ BablInstance instance;
+ BablConversion **from; /*< NULL terminated list of conversions from class */
+ BablConversion **to; /*< NULL terminated list of conversions to class */
+ int components;
+ BablComponent **component;
+} BablModel;
+
+typedef struct
+{
+ BablInstance instance;
+ BablConversion **from; /*< NULL terminated list of conversions from class */
+ BablConversion **to; /*< NULL terminated list of conversions to class */
+ int planar;
+ int bands;
+ BablComponent **component;
+ BablType **type;
+ BablSampling **sampling;
+ BablConversion *to_conversions;
+ BablConversion *from_conversions;
+} BablPixelFormat;
+
+typedef struct
+{
+ BablInstance instance;
+ union Babl *source;
+ union Babl *destination;
+} BablFish;
+
+typedef union
+{
+ BablClassType kind;
+ BablInstance instance;
+ BablType type;
+ BablSampling sampling;
+ BablComponent component;
+ BablModel model;
+ BablPixelFormat pixel_format;
+ BablConversion conversion;
+ BablFish fish;
+} Babl;
+
+
+#define BABL_NAME(obj) (((Babl*)(obj))->instance.name)
+#define BABL_INSTANCE_TYPE(obj) (((Babl*)(obj))->kind)
+
+#define BABL_IS_BABL(obj)\
+(NULL==(obj)?0:BABL_CLASS_TYPE_IS_VALID(BABL_INSTANCE_TYPE(obj)))
+
+#define BABL_IS_OF_KIND(obj,kind) \
+ (!BABL_IS_BABL(obj)?0:kind==BABL_INSTANCE_TYPE(obj)?1:0)
+
+#define BABL_IS_INSTANCE(obj) BABL_IS_OF_KIND(obj,BABL_TYPE)
+#define BABL_IS_TYPE(obj) BABL_IS_OF_KIND(obj,BABL_TYPE)
+#define BABL_IS_COMPONENT(obj) BABL_IS_OF_KIND(obj,BABL_COMPONENT)
+#define BABL_IS_SAMPLING(obj) BABL_IS_OF_KIND(obj,BABL_SAMPLING)
+#define BABL_IS_PIXEL_FORMAT(obj) BABL_IS_OF_KIND(obj,BABL_PIXEL_FORMAT)
+
+typedef int (*BablEachFunction) (Babl *entry,
+ void *data);
+
+const char *babl_class_name (BablClassType klass);
+
+#define BABL_DEFINE_CLASS(TypeName, type_name) \
+ \
+void type_name##_init (void); \
+void type_name##_each (BablEachFunction each_fun, \
+ void *user_data); \
+void type_name##_destroy (void); \
+TypeName * type_name (const char *name); \
+TypeName * type_name##_id (int id); \
+TypeName * type_name##_new (const char *name, \
+ ...);
+
+#endif
+
--- /dev/null
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "babl-internal.h"
+#include "babl-db.h"
+#include <string.h>
+
+#include <stdarg.h>
+
+
+static int
+each_babl_component_destroy (Babl *babl,
+ void *data)
+{
+ babl_free (babl->component.from);
+ babl_free (babl->component.to);
+ babl_free (babl->instance.name);
+ babl_free (babl);
+ return 0; /* continue iterating */
+}
+
+static BablComponent *
+component_new (const char *name,
+ int id,
+ int luma,
+ int chroma,
+ int alpha)
+{
+ BablComponent *self;
+
+ self = babl_calloc (sizeof (BablComponent), 1);
+ self->instance.type = BABL_COMPONENT;
+ self->instance.id = id;
+ self->instance.name = babl_strdup (name);
+ self->luma = luma;
+ self->chroma = chroma;
+ self->alpha = alpha;
+
+ return self;
+}
+
+BablComponent *
+babl_component_new (const char *name,
+ ...)
+{
+ va_list varg;
+ BablComponent *self;
+ int id = 0;
+ int luma = 0;
+ int chroma = 0;
+ int alpha = 0;
+ const char *arg=name;
+
+ va_start (varg, name);
+
+ while (1)
+ {
+ arg = va_arg (varg, char *);
+ if (!arg)
+ break;
+
+ if (BABL_IS_BABL (arg))
+ {
+ Babl *babl = (Babl*)arg;
+
+ switch (BABL_INSTANCE_TYPE (arg))
+ {
+ case BABL_TYPE:
+ case BABL_INSTANCE:
+ case BABL_COMPONENT:
+ case BABL_PIXEL_FORMAT:
+ case BABL_MODEL:
+ case BABL_SAMPLING:
+
+ case BABL_CONVERSION:
+ case BABL_CONVERSION_TYPE:
+ case BABL_CONVERSION_TYPE_PLANAR:
+ case BABL_CONVERSION_MODEL_PLANAR:
+ case BABL_CONVERSION_PIXEL_FORMAT:
+ case BABL_CONVERSION_PIXEL_FORMAT_PLANAR:
+ case BABL_FISH:
+ babl_log ("%s(): %s unexpected",
+ __FUNCTION__, babl_class_name (babl->instance.type));
+ break;
+ case BABL_SKY: /* shut up compiler */
+ break;
+ }
+ }
+ /* if we didn't point to a babl, we assume arguments to be strings */
+ else if (!strcmp (arg, "id"))
+ {
+ id = va_arg (varg, int);
+ }
+
+ else if (!strcmp (arg, "luma"))
+ {
+ luma = 1;
+ }
+
+ else if (!strcmp (arg, "chroma"))
+ {
+ chroma = 1;
+ }
+
+
+ else if (!strcmp (arg, "alpha"))
+ {
+ alpha = 1;
+ }
+
+ else
+ {
+ babl_log ("%s(): unhandled parameter '%s' for pixel_format '%s'",
+ __FUNCTION__, arg, name);
+ exit (-1);
+ }
+ }
+
+ va_end (varg);
+
+ self = component_new (name, id, luma, chroma, alpha);
+
+ if ((BablComponent*) db_insert ((Babl*)self) == self)
+ {
+ return self;
+ }
+ else
+ {
+ each_babl_component_destroy ((Babl*)self, NULL);
+ return NULL;
+ }
+}
+
+BABL_CLASS_TEMPLATE(BablComponent, babl_component, "BablComponent")
--- /dev/null
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef _BABL_COMPONENT_H
+#define _BABL_COMPONENT_H
+
+#include "babl-classes.h"
+BABL_DEFINE_CLASS(BablComponent, babl_component)
+
+#endif
--- /dev/null
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "babl-internal.h"
+#include "babl-db.h"
+#include "assert.h"
+#include <string.h>
+#include <stdarg.h>
+
+static int
+each_babl_conversion_destroy (Babl *babl,
+ void *data)
+{
+ babl_free (babl->instance.name);
+ babl_free (babl);
+ return 0; /* continue iterating */
+}
+
+static BablConversion *
+conversion_new (const char *name,
+ int id,
+ Babl *source,
+ Babl *destination,
+ int time_cost,
+ int loss,
+ BablFuncLinear linear,
+ BablFuncPlanar planar,
+ BablFuncPlanarBit planar_bit)
+{
+ BablConversion *self = NULL;
+
+ /* destination is of same type as source */
+ switch (BABL_INSTANCE_TYPE (source))
+ {
+ case BABL_TYPE:
+ if (linear)
+ {
+ self = babl_calloc (sizeof (BablConversionType), 1);
+ self->instance.type = BABL_CONVERSION_TYPE;
+ self->function.linear = linear;
+ }
+ else if (planar)
+ {
+ self = babl_calloc (sizeof (BablConversionTypePlanar), 1);
+ self->instance.type = BABL_CONVERSION_TYPE_PLANAR;
+ self->function.planar = planar;
+ }
+ else if (planar_bit)
+ {
+ babl_log ("%s(): planar_bit support not implemented yet",
+ __FUNCTION__);
+ }
+ break;
+ case BABL_SAMPLING:
+ babl_log ("%s(): sampling conversions not implemented yet\n",
+ __FUNCTION__);
+ break;
+ case BABL_COMPONENT:
+ babl_log ("%s(): component conversions do not make sense (except perhaps for gamma correction)\n",
+ __FUNCTION__);
+ break;
+ case BABL_MODEL:
+ if (linear)
+ {
+ babl_log ("%s(): linear support for model conversion not supported",
+ __FUNCTION__);
+ }
+ else if (planar)
+ {
+ self = babl_calloc (sizeof (BablConversionModelPlanar), 1);
+ self->instance.type = BABL_CONVERSION_MODEL_PLANAR;
+ self->function.planar = planar;
+ }
+ else if (planar_bit)
+ {
+ babl_log ("%s(): planar_bit support for model conversion not supported",
+ __FUNCTION__);
+ }
+ break;
+
+ case BABL_PIXEL_FORMAT:
+ if (linear)
+ {
+ self = babl_calloc (sizeof (BablConversionPixelFormat), 1);
+ self->instance.type = BABL_CONVERSION_PIXEL_FORMAT;
+ self->function.linear = linear;
+ }
+ else if (planar)
+ {
+ self = babl_calloc (sizeof (BablConversionPixelFormatPlanar), 1);
+ self->instance.type = BABL_CONVERSION_PIXEL_FORMAT_PLANAR;
+ self->function.planar = planar;
+ }
+ else if (planar_bit)
+ {
+ babl_log ("%s(): planar_bit support for pixelformat conversion not supported",
+ __FUNCTION__);
+ }
+ break;
+ default:
+ break;
+ }
+ if (!self)
+ {
+ babl_log ("%s(name='%s', ...): creation failed", __FUNCTION__, name);
+ return NULL;
+ }
+
+ self->instance.id = id;
+ self->instance.name = babl_strdup (name);
+ self->source = (union Babl*)source;
+ self->destination = (union Babl*)destination;
+ self->time_cost = time_cost;
+ self->loss = loss;
+
+ assert (BABL_IS_BABL (self->source));
+ assert (BABL_IS_BABL (self->destination));
+
+ babl_add_ptr_to_list ((void ***)&(source->type.from), self);
+ babl_add_ptr_to_list ((void ***)&(destination->type.to), self);
+
+ return (BablConversion*)self;
+}
+
+BablConversion *
+babl_conversion_new (const char *name,
+ ...)
+{
+ va_list varg;
+ BablConversion *self;
+
+ int id = 0;
+ Babl *source = NULL;
+ Babl *destination = NULL;
+ int time_cost = 0;
+ int loss = 0;
+ BablFuncLinear linear = NULL;
+ BablFuncPlanar planar = NULL;
+ BablFuncPlanarBit planar_bit = NULL;
+
+ int got_func = 0;
+ const char *arg = name;
+
+ va_start (varg, name);
+
+ while (1)
+ {
+ arg = va_arg (varg, char *);
+ if (!arg)
+ break;
+
+ else if (!strcmp (arg, "id"))
+ {
+ id = va_arg (varg, int);
+ }
+
+ else if (!strcmp (arg, "linear"))
+ {
+ if (got_func++)
+ {
+ babl_log ("%s(): already got a conversion func, registration of multiple might be possible later\n",
+ __FUNCTION__);
+ }
+ linear = va_arg (varg, BablFuncLinear);
+ }
+
+ else if (!strcmp (arg, "planar"))
+ {
+ if (got_func++)
+ {
+ babl_log ("%s(): already got a conversion func, registration of multiple might be possible later\n",
+ __FUNCTION__);
+ }
+ planar = va_arg (varg, BablFuncPlanar);
+ }
+
+ else if (!strcmp (arg, "planar-bit"))
+ {
+ if (got_func++)
+ {
+ babl_log ("%s(): already got a conversion func, registration of multiple might be possible later\n",
+ __FUNCTION__);
+ }
+ planar_bit = va_arg (varg, BablFuncPlanarBit);
+ }
+
+ else if (!strcmp (arg, "time-cost"))
+ {
+ time_cost = va_arg (varg, int);
+ }
+ else if (!strcmp (arg, "loss"))
+ {
+ loss = va_arg (varg, int);
+ }
+ else if (!strcmp (arg, "source"))
+ {
+ source = va_arg (varg, Babl*);
+ }
+ else if (!strcmp (arg, "destination"))
+ {
+ destination = va_arg (varg, Babl*);
+ }
+ else
+ {
+ babl_log ("%s(): unhandled parameter '%s' for pixel_format '%s'",
+ __FUNCTION__, arg, name);
+ exit (-1);
+ }
+ }
+
+ va_end (varg);
+
+ self = conversion_new (name, id,
+ source, destination, time_cost, loss, linear, planar, planar_bit);
+
+ if ((BablConversion*) db_insert ( (Babl*)self) == self)
+ {
+ return self;
+ }
+ else
+ {
+ each_babl_conversion_destroy ( (Babl*)self, NULL);
+ return NULL;
+ }
+}
+
+BABL_CLASS_TEMPLATE(BablConversion, babl_conversion, "BablConversion")
--- /dev/null
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef BABL_CONVERSION_H
+#define BABL_CONVERSION_H
+
+#include "babl-classes.h"
+BABL_DEFINE_CLASS(BablConversion, babl_conversion)
+
+#endif
--- /dev/null
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+
+#ifndef _DB_H
+#define _DB_H
+
+#ifndef _BABL_INTERNAL_H
+#error babl-internal.h must be included before babl-db.h, babl-db.h is strictly internal to babl core classes.
+#endif
+
+#include "babl-classes.h"
+
+#include <string.h>
+
+#define DB_DEF static inline
+#define DB_INITIAL_SIZE 0
+#define DB_INCREMENT_SIZE 16
+
+
+/* file scope variables, for this .c file's database */
+static int db_size = 0;
+static int db_entries = 0;
+static Babl **db;
+
+DB_DEF void db_init (void);
+DB_DEF void db_destroy (void);
+DB_DEF void db_each (BablEachFunction each_fun,
+ void *user_data);
+DB_DEF Babl * db_insert (Babl *entry);
+DB_DEF Babl * db_exist (int id,
+ const char *name);
+
+DB_DEF Babl * db_find (const char *name)
+{
+ Babl *ret = db_exist (0, name);
+
+ if (!ret)
+ {
+ const char *sample_type = "unknwon";
+
+ if (db[0])
+ sample_type = babl_class_name (db[0]->instance.type);
+ babl_log ("%s(\"%s\"): failed (query performed on a %s database)",
+ __FUNCTION__, name, sample_type);
+ }
+ return ret;
+}
+
+
+DB_DEF void
+db_init(void)
+{
+ if (0==db_size)
+ {
+ db_size = DB_INITIAL_SIZE;
+ db = babl_malloc (db_size * sizeof (BablInstance*));
+ memset (db, 0, db_size * sizeof (BablInstance*));
+ }
+}
+
+
+DB_DEF void
+db_destroy (void)
+{
+ babl_free (db);
+ db_size = 0;
+ db_entries = 0;
+ db = NULL;
+}
+
+
+DB_DEF Babl *
+db_insert (Babl *babl)
+{
+ Babl *collision;
+
+ if (!babl)
+ {
+ babl_log ("%s(babl=%p)", __FUNCTION__, babl);
+ return NULL;
+ }
+
+ collision = db_exist (babl->instance.id, babl->instance.name);
+
+ if (collision)
+ {
+ if (collision->instance.id == babl->instance.id)
+ babl_log ("%s: conflicting id: existing(%i:'%s') - new(%i:'%s')",
+ __FUNCTION__, collision->instance.id, collision->instance.name,
+ babl->instance.id, babl->instance.name);
+ else if (!strcmp (collision->instance.name, babl->instance.name))
+ babl_log ("%s: conflicting name: existing(%i:'%s') - new(%i:'%s')",
+ __FUNCTION__, collision->instance.id, collision->instance.name,
+ babl->instance.id, babl->instance.name);
+ return collision;
+ }
+
+ if (db_entries + 1 > db_size) /* must reallocate storage */
+ {
+ Babl **new_db;
+
+ new_db = babl_realloc (db, (db_size + DB_INCREMENT_SIZE) * sizeof (BablInstance*));
+ if (!new_db)
+ {
+ babl_log ("db_insert: unable to reallocate memory, element (%i:'%s') not inserted", babl->instance.id, babl->instance.name);
+ return NULL;
+ }
+ db = new_db;
+
+ /* null out the currently unused portions of memory */
+ memset (db + db_size, 0, DB_INCREMENT_SIZE * sizeof (Babl*));
+ db_size += DB_INCREMENT_SIZE;
+ }
+ db[db_entries++]=babl;
+ return babl;
+}
+
+
+DB_DEF void
+db_each (BablEachFunction each_fun,
+ void *user_data)
+{
+ int i;
+
+ for (i=0; i< db_entries; i++)
+ {
+ if (db[i])
+ {
+ if (each_fun ((Babl*) db[i], user_data))
+ break;
+ }
+ }
+}
+
+typedef struct DbExistData
+{
+ unsigned int type;
+ int id;
+ const char *name;
+ Babl *ret;
+} DbExistData;
+
+DB_DEF int
+db_each_exist (Babl *babl,
+ void *void_data)
+{
+ DbExistData *data = void_data;
+
+ if (data->id &&
+ data->id == babl->instance.id)
+ {
+ data->ret = babl;
+ return 1;
+ }
+ if (data->name &&
+ !strcmp (babl->instance.name, data->name))
+ {
+ data->ret = babl;
+ return 1;
+ }
+ return 0; /* continue iterating */
+}
+
+DB_DEF Babl *
+db_exist (int id,
+ const char *name)
+{
+ DbExistData data;
+
+ data.id = id;
+ data.name = name;
+ data.ret = NULL;
+
+ db_each (db_each_exist, &data);
+
+ return data.ret;
+}
+
+#endif
--- /dev/null
+/* babl - dynamically extendable universal pixel fish library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "babl-internal.h"
+#include "babl-db.h"
+#include "assert.h"
+#include <string.h>
+#include <stdarg.h>
+
+static int
+each_babl_fish_destroy (Babl *babl,
+ void *data)
+{
+ babl_free (babl->instance.name);
+ babl_free (babl);
+ return 0; /* continue iterating */
+}
+
+static BablFish *
+fish_new (const char *name,
+ int id,
+ Babl *source,
+ Babl *destination)
+{
+ BablFish *self = NULL;
+
+ self = babl_calloc (sizeof (BablFish), 1);
+ self->instance.type = BABL_FISH;
+
+ self->instance.id = id;
+ self->instance.name = babl_strdup (name);
+ self->source = (union Babl*)source;
+ self->destination = (union Babl*)destination;
+
+ assert (BABL_IS_BABL (self->source));
+ assert (BABL_IS_BABL (self->destination));
+
+/* Might make sense to allow a precalculated shortcut to
+ * participate in later checks for optimal conversions
+
+ babl_add_ptr_to_list ((void ***)&(source->type.from), self);
+ babl_add_ptr_to_list ((void ***)&(destination->type.to), self);
+ */
+
+ return (BablFish*)self;
+}
+
+BablFish *
+babl_fish_new (const char *name,
+ ...)
+{
+ va_list varg;
+ BablFish *self;
+
+ int id = 0;
+ Babl *source = NULL;
+ Babl *destination = NULL;
+
+ const char *arg = name;
+
+ va_start (varg, name);
+
+ while (1)
+ {
+ arg = va_arg (varg, char *);
+ if (!arg)
+ break;
+
+ else if (!strcmp (arg, "id"))
+ {
+ id = va_arg (varg, int);
+ }
+
+ else if (!strcmp (arg, "source"))
+ {
+ source = va_arg (varg, Babl*);
+ }
+ else if (!strcmp (arg, "destination"))
+ {
+ destination = va_arg (varg, Babl*);
+ }
+ else
+ {
+ babl_log ("%s(): unhandled parameter '%s' for pixel_format '%s'",
+ __FUNCTION__, arg, name);
+ exit (-1);
+ }
+ }
+
+ va_end (varg);
+
+ self = fish_new (name, id,
+ source, destination);
+
+ if ((BablFish*) db_insert ( (Babl*)self) == self)
+ {
+ return self;
+ }
+ else
+ {
+ each_babl_fish_destroy ( (Babl*)self, NULL);
+ return NULL;
+ }
+}
+
+BABL_CLASS_TEMPLATE(BablFish, babl_fish, "BablFish")
--- /dev/null
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef BABL_FISH_H
+#define BABL_FISH_H
+
+#include "babl-classes.h"
+BABL_DEFINE_CLASS(BablFish, babl_fish)
+
+#endif
--- /dev/null
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <string.h>
+#include <stdarg.h>
+
+#include "babl-internal.h"
+#include "babl-sampling.h"
+#include "babl-type.h"
+#include "babl-component.h"
+#include "babl-db.h"
+
+#define BABL_MAX_BANDS 32
+
+static int
+each_babl_pixel_format_destroy (Babl *babl,
+ void *data)
+{
+ babl_free (babl->pixel_format.from);
+ babl_free (babl->pixel_format.to);
+ babl_free (babl->pixel_format.component);
+ babl_free (babl->pixel_format.type);
+ babl_free (babl->pixel_format.sampling);
+ babl_free (babl->instance.name);
+ babl_free (babl);
+
+ return 0; /* continue iterating */
+}
+
+static BablPixelFormat *
+pixel_format_new (const char *name,
+ int id,
+ int planar,
+ int bands,
+ BablComponent **band_component,
+ BablSampling **band_sampling,
+ BablType **band_type)
+{
+ BablPixelFormat *self;
+ int band;
+
+ self = babl_calloc (sizeof (BablPixelFormat), 1);
+
+ self->instance.type = BABL_PIXEL_FORMAT;
+ self->instance.id = id;
+ self->instance.name = babl_strdup (name);
+
+ self->bands = bands;
+ self->planar = planar;
+
+ self->component = babl_malloc (sizeof (BablComponent*) * (bands+1));
+ self->type = babl_malloc (sizeof (BablType*) * (bands+1));
+ self->sampling = babl_malloc (sizeof (BablSampling*) * (bands+1));
+
+ for (band=0; band < bands; band++)
+ {
+ self->component[band] = band_component[band];
+ self->type[band] = band_type[band];
+ self->sampling[band] = band_sampling[band];
+ }
+ self->component[band] = NULL;
+ self->type[band] = NULL;
+ self->sampling[band] = NULL;
+
+ return self;
+}
+
+BablPixelFormat *
+babl_pixel_format_new (const char *name,
+ ...)
+{
+ va_list varg;
+ BablPixelFormat *self;
+ int id = 0;
+ int planar = 0;
+ int bands = 0;
+ BablComponent *band_component [BABL_MAX_BANDS];
+ BablSampling *band_sampling [BABL_MAX_BANDS];
+ BablType *band_type [BABL_MAX_BANDS];
+
+ BablSampling *current_sampling = babl_sampling (1,1);
+ BablType *current_type = babl_type_id (BABL_U8);
+ const char *arg=name;
+
+ va_start (varg, name);
+
+
+ while (1)
+ {
+ arg = va_arg (varg, char *);
+ if (!arg)
+ break;
+
+
+ if (BABL_IS_BABL (arg))
+ {
+ Babl *babl = (Babl*)arg;
+
+ switch (BABL_INSTANCE_TYPE (arg))
+ {
+ case BABL_TYPE:
+ current_type = (BablType*) babl;
+ break;
+ case BABL_COMPONENT:
+ band_component [bands] = (BablComponent*) babl;
+ band_type [bands] = current_type;
+ band_sampling [bands] = current_sampling;
+ bands++;
+
+ if (bands>=BABL_MAX_BANDS)
+ {
+ babl_log ("maximum number of bands (%i) exceeded for %s",
+ BABL_MAX_BANDS, name);
+ }
+ break;
+ case BABL_SAMPLING:
+ current_sampling = (BablSampling*)arg;
+ break;
+ case BABL_INSTANCE:
+ case BABL_MODEL:
+ babl_log ("%s(): %s not handled in pixel format yet",
+ __FUNCTION__, babl_class_name (babl->instance.type));
+ break;
+ case BABL_PIXEL_FORMAT:
+
+ case BABL_CONVERSION:
+ case BABL_CONVERSION_TYPE:
+ case BABL_CONVERSION_TYPE_PLANAR:
+ case BABL_CONVERSION_MODEL_PLANAR:
+ case BABL_CONVERSION_PIXEL_FORMAT:
+ case BABL_CONVERSION_PIXEL_FORMAT_PLANAR:
+ case BABL_FISH:
+ babl_log ("%s(): %s unexpected",
+ __FUNCTION__, babl_class_name (babl->instance.type));
+ break;
+ case BABL_SKY: /* shut up compiler */
+ break;
+ }
+ }
+ /* if we didn't point to a babl, we assume arguments to be strings */
+ else if (!strcmp (arg, "id"))
+ {
+ id = va_arg (varg, int);
+ }
+
+ else if (!strcmp (arg, "packed"))
+ {
+ planar = 0;
+ }
+
+ else if (!strcmp (arg, "planar"))
+ {
+ planar = 1;
+ }
+
+ else
+ {
+ babl_log ("%s: unhandled parameter '%s' for pixel_format '%s'",
+ __FUNCTION__, arg, name);
+ exit (-1);
+ }
+ }
+
+ va_end (varg);
+
+
+ self =pixel_format_new (name, id,
+ planar,
+ bands, band_component, band_sampling, band_type);
+
+
+ if ((BablPixelFormat*) db_insert ((Babl*)self) == self)
+ {
+ return self;
+ }
+ else
+ {
+ each_babl_pixel_format_destroy ((Babl*)self, NULL);
+ return NULL;
+ }
+}
+
+BABL_CLASS_TEMPLATE (BablPixelFormat, babl_pixel_format, "BablPixelFormat")
--- /dev/null
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef _BABL_PIXEL_FORMAT_H
+#define _BABL_PIXEL_FORMAT_H
+
+#include "babl-classes.h"
+BABL_DEFINE_CLASS(BablPixelFormat, babl_pixel_format)
+
+#endif
--- /dev/null
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef _BABL_IDS_H
+#define _BABL_IDS_H
+
+enum {
+ BABL_UNDEFINED = 0,
+ BABL_TYPE_BASE = 100,
+ BABL_U8,
+ BABL_U16,
+ BABL_FLOAT,
+ BABL_DOUBLE,
+ BABL_HALF_FLOAT,
+
+ BABL_COMPONENT_BASE = 1000,
+ BABL_RED,
+ BABL_GREEN,
+ BABL_BLUE,
+ BABL_ALPHA,
+ BABL_LUMINANCE,
+ BABL_RED_MUL_ALPHA,
+ BABL_GREEN_MUL_ALPHA,
+ BABL_BLUE_MUL_ALPHA,
+ BABL_RED_GAMMA_2_2,
+ BABL_GREEN_GAMMA_2_2,
+ BABL_BLUE_GAMMA_2_2,
+ BABL_CYAN,
+ BABL_MAGENTA,
+ BABL_YELLOW,
+ BABL_KEY,
+ BABL_CB,
+ BABL_CR,
+ BABL_LAB_L,
+ BABL_LAB_A,
+ BABL_LAB_B,
+ BABL_X,
+ BABL_Y,
+ BABL_Z,
+ BABL_Z_BUFFER,
+ BABL_PADDING,
+
+ BABL_MODEL_BASE = 10000,
+ BABL_RGB,
+ BABL_RGBA,
+ BABL_RGBA_PREMULTIPLIED,
+ BABL_RGB_GAMMA_2_2,
+ BABL_RGBA_GAMMA_2_2,
+ BABL_CMY,
+ BABL_CMYK,
+ BABL_CMYKA,
+ BABL_YCBCR,
+ BABL_GRAYSCALE,
+ BABL_GRAYSCALE_ALPHA,
+
+ BABL_PIXEL_FORMAT_BASE = 100000,
+ BABL_SRGB,
+ BABL_SRGBA,
+ BABL_RGB_FLOAT,
+ BABL_RGBA_FLOAT,
+ BABL_CMYK_FLOAT,
+ BABL_CMYKA_FLOAT,
+ BABL_YUV420,
+#if 0
+ BABL_RGB_U8,
+ BABL_RGBA_U8,
+ BABL_RGBA_U16,
+ BABL_RGBA_FLOAT,
+ BABL_YUV411,
+ BABL_YUV422,
+#endif
+
+ BABL_PIXEL_USER_BASE,
+};
+
+
+#endif
+
+
+
--- /dev/null
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "babl-classes.h"
+
+static const char *class_names[] =
+ {
+ "BablInstance",
+ "BablType",
+ "BablSampling",
+ "BablComponent",
+ "BablModel",
+ "BablPixelFormat",
+ "BablConversion",
+ "BablConversionType",
+ "BablConversionTypePlanar",
+ "BablConversionModelPlanar",
+ "BablConversionPixelFormatPlanar",
+ "BablConversionPixelFormatPlanar",
+ "BablFish",
+ "BablCeiling"
+ };
+
+const char *
+babl_class_name (BablClassType klass)
+{
+ return class_names[klass-BABL_INSTANCE];
+}
+
+int babl_hmpf_on_name_lookups = 1;
+
--- /dev/null
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef _BABL_INTERNAL_H
+#define _BABL_INTERNAL_H
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "babl-ids.h"
+#include "babl-util.h"
+#include "babl-memory.h"
+#include "babl-classes.h"
+
+#define babl_log(fmt, args...) do { \
+ fprintf (stdout, "babl: "); \
+ fprintf (stdout, fmt, args); \
+ fprintf (stdout, "\n"); \
+} while (0)
+
+
+extern int babl_hmpf_on_name_lookups;
+
+#define BABL_DEFINE_EACH(type_name) \
+void \
+type_name##_each (BablEachFunction each_fun, \
+ void *user_data) \
+{ \
+ db_each (each_fun, user_data); \
+} \
+
+#define BABL_DEFINE_LOOKUP_BY_ID(TypeName, type_name) \
+TypeName * \
+type_name##_id (int id) \
+{ \
+ return (TypeName*) db_exist (id, NULL); \
+}
+
+#define BABL_DEFINE_LOOKUP_BY_NAME(TypeName, type_name) \
+TypeName * \
+type_name (const char *name) \
+{ \
+ if (babl_hmpf_on_name_lookups) \
+ { \
+ babl_log ("%s(\"%s\"): hmpf!", __FUNCTION__, name); \
+ } \
+ return (TypeName*) db_exist (0, name); \
+}
+
+#define BABL_DEFINE_INIT(type_name) \
+void \
+type_name##_init (void) \
+{ \
+ db_init (); \
+}
+
+#define BABL_DEFINE_DESTROY(type_name) \
+void \
+type_name##_destroy (void) \
+{ \
+ db_each (each_##type_name##_destroy, NULL); \
+ db_destroy (); \
+}
+
+#define BABL_CLASS_TEMPLATE(TypeName, type_name, type_string) \
+BABL_DEFINE_INIT (type_name) \
+BABL_DEFINE_DESTROY (type_name) \
+BABL_DEFINE_LOOKUP_BY_NAME (TypeName, type_name) \
+BABL_DEFINE_EACH (type_name) \
+BABL_DEFINE_LOOKUP_BY_ID (TypeName, type_name)
+
+
+#endif
--- /dev/null
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "babl.h"
+#include "babl-internal.h" /* for babl_log */
+
+static void sampling_introspect (Babl *babl);
+static void model_introspect (Babl *babl);
+static void type_introspect (Babl *babl);
+static void pixel_format_introspect (Babl *babl);
+static int each_introspect (Babl *babl,
+ void *user_data);
+
+void
+babl_introspect (void)
+{
+ babl_log ("Introspection report%s","");
+ babl_log ("====================================================%s" ,"");
+
+ babl_log ("%s","");
+ babl_log ("Data Types:%s", "");
+ babl_type_each (each_introspect, NULL);
+ babl_log ("%s","");
+ babl_log ("Sampling (chroma subsampling) factors:%s", "");
+ babl_sampling_each (each_introspect, NULL);
+ babl_log ("%s","");
+ babl_log ("Components:%s", "");
+ babl_component_each (each_introspect, NULL);
+ babl_log ("%s","");
+ babl_log ("Models (of components):%s", "");
+ babl_model_each (each_introspect, NULL);
+ babl_log ("%s","");
+ babl_log ("Pixel formats:%s", "");
+ babl_pixel_format_each (each_introspect, NULL);
+ babl_log ("%s","");
+ babl_log ("conversions:%s", "");
+ babl_conversion_each (each_introspect, NULL);
+ babl_log ("%s","");
+ babl_log ("fishes:%s", "");
+ babl_fish_each (each_introspect, NULL);
+
+ babl_log ("%s", "");
+}
+
+static int list_length (void **list)
+{
+ void **ptr;
+ int len=0;
+
+ ptr = list;
+ while (NULL!=*ptr)
+ {
+ ptr++;
+ len++;
+ }
+ return len;
+}
+
+
+static void
+item_conversions_introspect (Babl *babl)
+{
+ void **ptr;
+
+ if (babl->type.from)
+ babl_log ("\t\tconversions from %s: %i",
+ babl->instance.name, list_length ((void **)(babl->type.from)));
+
+ ptr = (void **)babl->type.from;
+
+ while (ptr && NULL!=*ptr)
+ {
+ babl_log ("\t\t\t'%s'", ((Babl *)(*ptr))->instance.name);
+ ptr++;
+ }
+
+ if (babl->type.to)
+ babl_log ("\t\tconversions to %s: %i",
+ babl->instance.name, list_length ((void **)(babl->type.to)));
+
+
+ ptr = (void **)babl->type.to;
+
+ while (ptr && NULL!=*ptr)
+ {
+ babl_log ("\t\t\t'%s'", ((Babl *)(*ptr))->instance.name);
+ ptr++;
+ }
+}
+
+static void
+model_introspect (Babl *babl)
+{
+ int i;
+ babl_log ("\t\tcomponents=%i", babl->model.components);
+
+ for (i=0; i< babl->model.components; i++)
+ {
+ babl_log ("\t\tindex[%i] = '%s'",
+ i, BABL_NAME (babl->model.component[i]));
+ }
+}
+
+static void
+type_introspect (Babl *babl)
+{
+ babl_log ("\t\tbits=%i", babl->type.bits);
+}
+
+
+static void
+sampling_introspect (Babl *babl)
+{
+ babl_log ("\t\thorizontal = %i",
+ babl->sampling.horizontal);
+ babl_log ("\t\tvertical = %i",
+ babl->sampling.vertical);
+}
+
+
+static void
+pixel_format_introspect (Babl *babl)
+{
+ int i;
+ babl_log ("\t\tplanar=%i", babl->pixel_format.planar);
+ babl_log ("\t\tbands=%i", babl->pixel_format.bands);
+
+ for (i=0; i< babl->pixel_format.bands; i++)
+ {
+ babl_log ("\t\tband[%i] type='%s' component='%s'",
+ i, BABL_NAME (babl->pixel_format.type[i]),
+ BABL_NAME (babl->pixel_format.component[i]));
+ }
+}
+
+static int
+each_introspect (Babl *babl,
+ void *user_data)
+{
+ babl_log ("\t'%s'\t%i\t%s",
+ babl->instance.name,
+ babl->instance.id,
+ babl_class_name (babl->instance.type));
+ switch (babl->instance.type)
+ {
+ case BABL_TYPE:
+ type_introspect (babl);
+ item_conversions_introspect (babl);
+ break;
+ case BABL_COMPONENT:
+ item_conversions_introspect (babl);
+ break;
+ case BABL_MODEL:
+ model_introspect (babl);
+ item_conversions_introspect (babl);
+ break;
+ case BABL_PIXEL_FORMAT:
+ pixel_format_introspect (babl);
+ item_conversions_introspect (babl);
+ break;
+ case BABL_SAMPLING:
+ sampling_introspect (babl);
+ item_conversions_introspect (babl);
+ break;
+ case BABL_FISH:
+ babl_log ("\t\tneed more data here%s", "");
+ break;
+ default:
+ break;
+ }
+ return 0;
+}
--- /dev/null
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef _BABL_INTROSPECT_H
+#define _BABL_INTROSPECT_H
+
+void
+babl_introspect (void);
+
+#endif
--- /dev/null
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "babl-internal.h"
+
+static int mallocs=0;
+static int frees=0;
+static int strdups=0;
+static int reallocs=0;
+static int callocs=0;
+
+static const char *
+mem_stats (void)
+{
+ static char buf[128];
+ sprintf (buf, "mallocs:%i callocs:%i strdups:%i allocs:%i frees:%i reallocs:%i\t|",
+ mallocs, callocs, strdups, mallocs+callocs+strdups, frees, reallocs);
+ return buf;
+}
+
+void *
+babl_malloc (size_t size)
+{
+ void *ret;
+
+ ret = malloc (size);
+ if (!ret)
+ babl_log ("%s(%i): failed", __FUNCTION__, size);
+ mallocs++;
+ return ret;
+}
+
+char *
+babl_strdup (const char *s)
+{
+ char *ret;
+
+ ret = strdup (s);
+ if (!ret)
+ babl_log ("%s(%s): failed", __FUNCTION__, s);
+ strdups++;
+ return ret;
+}
+
+void
+babl_free (void *ptr)
+{
+ if (!ptr)
+ return;
+ free (ptr);
+ frees++;
+}
+
+void *
+babl_realloc (void *ptr,
+ size_t size)
+{
+ void *ret;
+
+ ret = realloc (ptr, size);
+
+ if (!ret)
+ babl_log ("%s(%p, %i): failed", __FUNCTION__, ptr, size);
+
+ reallocs++;
+
+ if (!ptr) /* to make the statistics work out */
+ mallocs++;
+
+ return ret;
+}
+
+void *
+babl_calloc (size_t nmemb,
+ size_t size)
+{
+ void *ret = calloc (nmemb, size);
+
+ if (!ret)
+ babl_log ("%s(%i, %i): failed", __FUNCTION__, nmemb, size);
+
+ callocs++;
+ return ret;
+}
+
+void
+babl_memory_sanity (void)
+{
+ if (frees != mallocs + strdups + callocs)
+ {
+ fprintf (stderr,
+"babl_memory usage does not add up!!!!!!!!\n"
+"%s\n"
+"balance: %i-%i=%i\n",
+ mem_stats(), (strdups+mallocs+callocs),frees, (strdups+mallocs+callocs)-frees);
+ }
+}
--- /dev/null
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef _BABL_MEMORY_H
+#define _BABL_MEMORY_H
+
+void * babl_malloc (size_t size);
+void babl_free (void *ptr);
+
+void * babl_realloc (void *ptr,
+ size_t size);
+
+void * babl_calloc (size_t nmemb,
+ size_t size);
+char * babl_strdup (const char *s);
+void babl_memory_sanity (void);
+
+#endif
--- /dev/null
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "babl-internal.h"
+#include <string.h>
+#include <stdarg.h>
+#include "babl-db.h"
+
+
+static int
+each_babl_model_destroy (Babl *babl,
+ void *data)
+{
+ babl_free (babl->model.from);
+ babl_free (babl->model.to);
+ babl_free (babl->model.component);
+ babl_free (babl->instance.name);
+ babl_free (babl);
+ return 0; /* continue iterating */
+}
+
+
+#define BABL_MAX_COMPONENTS 32
+
+static BablModel *
+model_new (const char *name,
+ int id,
+ int components,
+ BablComponent **component)
+{
+ BablModel *self;
+ int i;
+
+ self = babl_calloc (sizeof (BablModel), 1);
+
+ self->instance.type = BABL_MODEL;
+ self->instance.id = id;
+ self->instance.name = babl_strdup (name);
+
+ self->components = components;
+
+ self->component = babl_malloc (sizeof (BablComponent*) * (components+1));
+
+ for (i=0; i < components; i++)
+ {
+ self->component[i] = component[i];
+ }
+ self->component[i] = NULL;
+
+ return self;
+}
+
+BablModel *
+babl_model_new (const char *name,
+ ...)
+{
+ va_list varg;
+ BablModel *self;
+ int id = 0;
+ int components = 0;
+ BablComponent *band_component [BABL_MAX_COMPONENTS];
+ const char *arg=name;
+
+ va_start (varg, name);
+
+
+ while (1)
+ {
+ arg = va_arg (varg, char *);
+ if (!arg)
+ break;
+
+
+ if (BABL_IS_BABL (arg))
+ {
+ Babl *babl = (Babl*)arg;
+
+ switch (BABL_INSTANCE_TYPE (arg))
+ {
+ case BABL_COMPONENT:
+ band_component [components] = (BablComponent*) babl;
+ components++;
+
+ if (components>=BABL_MAX_COMPONENTS)
+ {
+ babl_log ("%s(): maximum number of components (%i) exceeded for %s",
+ __FUNCTION__, BABL_MAX_COMPONENTS, name);
+ }
+ break;
+ case BABL_MODEL:
+ babl_log ("%s(): submodels not handled yet", __FUNCTION__);
+ break;
+ case BABL_TYPE:
+ case BABL_SAMPLING:
+ case BABL_INSTANCE:
+ case BABL_PIXEL_FORMAT:
+
+
+ case BABL_CONVERSION:
+ case BABL_CONVERSION_TYPE:
+ case BABL_CONVERSION_TYPE_PLANAR:
+ case BABL_CONVERSION_MODEL_PLANAR:
+ case BABL_CONVERSION_PIXEL_FORMAT:
+ case BABL_CONVERSION_PIXEL_FORMAT_PLANAR:
+ case BABL_FISH:
+ babl_log ("%s(): %s unexpected",
+ __FUNCTION__, babl_class_name (babl->instance.type));
+ break;
+ case BABL_SKY: /* shut up compiler */
+ break;
+ }
+ }
+ /* if we didn't point to a babl, we assume arguments to be strings */
+ else if (!strcmp (arg, "id"))
+ {
+ id = va_arg (varg, int);
+ }
+
+ else
+ {
+ babl_log ("%s: unhandled parameter '%s' for babl_model '%s'",
+ __FUNCTION__, arg, name);
+ exit (-1);
+ }
+ }
+
+ va_end (varg);
+
+ self = model_new (name, id, components, band_component);
+
+ if ((BablModel*) db_insert ((Babl*)self) == self)
+ {
+ return self;
+ }
+ else
+ {
+ each_babl_model_destroy ((Babl*)self, NULL);
+ return NULL;
+ }
+}
+
+BABL_CLASS_TEMPLATE (BablModel, babl_model, "BablModel")
--- /dev/null
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef _BABL_pixel_format_H
+#define _BABL_pixel_format_H
+
+#include "babl-classes.h"
+BABL_DEFINE_CLASS(BablModel, babl_model)
+
+#endif
--- /dev/null
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <string.h>
+#include <stdarg.h>
+
+#include "babl-internal.h"
+#include "babl-sampling.h"
+#include "babl-type.h"
+#include "babl-component.h"
+#include "babl-db.h"
+
+#define BABL_MAX_BANDS 32
+
+static int
+each_babl_pixel_format_destroy (Babl *babl,
+ void *data)
+{
+ babl_free (babl->pixel_format.from);
+ babl_free (babl->pixel_format.to);
+ babl_free (babl->pixel_format.component);
+ babl_free (babl->pixel_format.type);
+ babl_free (babl->pixel_format.sampling);
+ babl_free (babl->instance.name);
+ babl_free (babl);
+
+ return 0; /* continue iterating */
+}
+
+static BablPixelFormat *
+pixel_format_new (const char *name,
+ int id,
+ int planar,
+ int bands,
+ BablComponent **band_component,
+ BablSampling **band_sampling,
+ BablType **band_type)
+{
+ BablPixelFormat *self;
+ int band;
+
+ self = babl_calloc (sizeof (BablPixelFormat), 1);
+
+ self->instance.type = BABL_PIXEL_FORMAT;
+ self->instance.id = id;
+ self->instance.name = babl_strdup (name);
+
+ self->bands = bands;
+ self->planar = planar;
+
+ self->component = babl_malloc (sizeof (BablComponent*) * (bands+1));
+ self->type = babl_malloc (sizeof (BablType*) * (bands+1));
+ self->sampling = babl_malloc (sizeof (BablSampling*) * (bands+1));
+
+ for (band=0; band < bands; band++)
+ {
+ self->component[band] = band_component[band];
+ self->type[band] = band_type[band];
+ self->sampling[band] = band_sampling[band];
+ }
+ self->component[band] = NULL;
+ self->type[band] = NULL;
+ self->sampling[band] = NULL;
+
+ return self;
+}
+
+BablPixelFormat *
+babl_pixel_format_new (const char *name,
+ ...)
+{
+ va_list varg;
+ BablPixelFormat *self;
+ int id = 0;
+ int planar = 0;
+ int bands = 0;
+ BablComponent *band_component [BABL_MAX_BANDS];
+ BablSampling *band_sampling [BABL_MAX_BANDS];
+ BablType *band_type [BABL_MAX_BANDS];
+
+ BablSampling *current_sampling = babl_sampling (1,1);
+ BablType *current_type = babl_type_id (BABL_U8);
+ const char *arg=name;
+
+ va_start (varg, name);
+
+
+ while (1)
+ {
+ arg = va_arg (varg, char *);
+ if (!arg)
+ break;
+
+
+ if (BABL_IS_BABL (arg))
+ {
+ Babl *babl = (Babl*)arg;
+
+ switch (BABL_INSTANCE_TYPE (arg))
+ {
+ case BABL_TYPE:
+ current_type = (BablType*) babl;
+ break;
+ case BABL_COMPONENT:
+ band_component [bands] = (BablComponent*) babl;
+ band_type [bands] = current_type;
+ band_sampling [bands] = current_sampling;
+ bands++;
+
+ if (bands>=BABL_MAX_BANDS)
+ {
+ babl_log ("maximum number of bands (%i) exceeded for %s",
+ BABL_MAX_BANDS, name);
+ }
+ break;
+ case BABL_SAMPLING:
+ current_sampling = (BablSampling*)arg;
+ break;
+ case BABL_INSTANCE:
+ case BABL_MODEL:
+ babl_log ("%s(): %s not handled in pixel format yet",
+ __FUNCTION__, babl_class_name (babl->instance.type));
+ break;
+ case BABL_PIXEL_FORMAT:
+
+ case BABL_CONVERSION:
+ case BABL_CONVERSION_TYPE:
+ case BABL_CONVERSION_TYPE_PLANAR:
+ case BABL_CONVERSION_MODEL_PLANAR:
+ case BABL_CONVERSION_PIXEL_FORMAT:
+ case BABL_CONVERSION_PIXEL_FORMAT_PLANAR:
+ case BABL_FISH:
+ babl_log ("%s(): %s unexpected",
+ __FUNCTION__, babl_class_name (babl->instance.type));
+ break;
+ case BABL_SKY: /* shut up compiler */
+ break;
+ }
+ }
+ /* if we didn't point to a babl, we assume arguments to be strings */
+ else if (!strcmp (arg, "id"))
+ {
+ id = va_arg (varg, int);
+ }
+
+ else if (!strcmp (arg, "packed"))
+ {
+ planar = 0;
+ }
+
+ else if (!strcmp (arg, "planar"))
+ {
+ planar = 1;
+ }
+
+ else
+ {
+ babl_log ("%s: unhandled parameter '%s' for pixel_format '%s'",
+ __FUNCTION__, arg, name);
+ exit (-1);
+ }
+ }
+
+ va_end (varg);
+
+
+ self =pixel_format_new (name, id,
+ planar,
+ bands, band_component, band_sampling, band_type);
+
+
+ if ((BablPixelFormat*) db_insert ((Babl*)self) == self)
+ {
+ return self;
+ }
+ else
+ {
+ each_babl_pixel_format_destroy ((Babl*)self, NULL);
+ return NULL;
+ }
+}
+
+BABL_CLASS_TEMPLATE (BablPixelFormat, babl_pixel_format, "BablPixelFormat")
--- /dev/null
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef _BABL_PIXEL_FORMAT_H
+#define _BABL_PIXEL_FORMAT_H
+
+#include "babl-classes.h"
+BABL_DEFINE_CLASS(BablPixelFormat, babl_pixel_format)
+
+#endif
--- /dev/null
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#define HORIZONTAL_MIN 1
+#define HORIZONTAL_MAX 4
+#define VERTICAL_MIN 1
+#define VERTICAL_MAX 4
+
+#include "babl-internal.h"
+
+static BablSampling db[(HORIZONTAL_MAX-HORIZONTAL_MIN+1)*
+ (VERTICAL_MAX-VERTICAL_MIN+1)];
+
+BablSampling *
+babl_sampling (int horizontal,
+ int vertical)
+{
+ if (vertical>=1 &&
+ vertical<=4 &&
+ horizontal>=1 &&
+ horizontal<=4)
+ return &db [ (vertical-1) * 4 + (horizontal-1)];
+ else
+ babl_log ("babl_samping(%i,%i): parameters out of bounds",
+ horizontal, vertical);
+ return NULL;
+}
+
+
+static int
+each_babl_sampling_destroy (Babl *babl,
+ void *data)
+{
+ babl_free (babl->sampling.from);
+ babl_free (babl->sampling.to);
+ return 0; /* continue iterating */
+}
+
+void
+babl_sampling_each (BablEachFunction each_fun,
+ void *user_data)
+{
+ int horizontal;
+ int vertical;
+
+ for (horizontal=HORIZONTAL_MIN; horizontal<=HORIZONTAL_MAX; horizontal++)
+ for (vertical=VERTICAL_MIN; vertical<=VERTICAL_MAX; vertical++)
+ {
+ int index= (vertical-VERTICAL_MIN) * VERTICAL_MAX + (horizontal - HORIZONTAL_MIN);
+ if (each_fun ((Babl*) &(db[index]), user_data))
+ return;
+ }
+}
+
+
+void
+babl_sampling_destroy (void)
+{
+ babl_sampling_each (each_babl_sampling_destroy, NULL);
+}
+
+void
+babl_sampling_init (void)
+{
+ int horizontal;
+ int vertical;
+
+ for (horizontal=HORIZONTAL_MIN; horizontal<=HORIZONTAL_MAX; horizontal++)
+ for (vertical=VERTICAL_MIN; vertical<=VERTICAL_MAX; vertical++)
+ {
+ int index= (vertical-VERTICAL_MIN) * VERTICAL_MAX + (horizontal - HORIZONTAL_MIN);
+ db[index].instance.type = BABL_SAMPLING;
+ db[index].instance.id = 0;
+ db[index].instance.name = "Samplings have no name";
+ db[index].horizontal = horizontal;
+ db[index].vertical = vertical;
+ }
+}
--- /dev/null
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef _BABL_SAMPLING_H
+#define _BABL_SAMPLING_H
+
+#include "babl-classes.h"
+
+void babl_sampling_init (void);
+void babl_sampling_introspect (void);
+void babl_sampling_each (BablEachFunction each_fun,
+ void *user_data);
+void babl_sampling_destroy (void);
+BablSampling * babl_sampling (int horizontal,
+ int vertical);
+#endif
--- /dev/null
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "babl.h"
+#include "babl-internal.h"
+
+static int
+foo (Babl *babl,
+ void *user_data)
+{
+/* babl_log ("%s", babl->instance.name);*/
+ return 0;
+}
+
+static Babl *babl_conversion_source (Babl *babl);
+static Babl *babl_conversion_destination (Babl *babl);
+
+static int
+type_sanity (Babl *babl,
+ void *user_data)
+{
+ /* ensure that every type has reference conversions to
+ * and from double */
+ void **ptr;
+ int ok;
+
+ ok = 0;
+ if (babl->type.from)
+ {
+ ptr = (void **) babl->type.from;
+
+ while (ptr && NULL!=*ptr)
+ {
+ if (babl_conversion_destination ((Babl *)(*ptr)) == (Babl*)babl_type_id (BABL_DOUBLE))
+ {
+ ok = 1;
+ break;
+ }
+ ptr++;
+ }
+ }
+ if (!ok)
+ babl_log ("lack of sanity! type '%s' has no conversion to double",
+ babl->instance.name);
+
+
+ ok = 0;
+ if (babl->type.to)
+ {
+ ptr = (void **) babl->type.to;
+
+ while (ptr && NULL!=*ptr)
+ {
+ if (babl_conversion_source ((Babl *)(*ptr)) == (Babl*)babl_type_id (BABL_DOUBLE))
+ {
+ ok = 1;
+ break;
+ }
+ ptr++;
+ }
+ }
+ if (!ok)
+ babl_log ("lack of sanity! type '%s' has no conversion from double",
+ babl->instance.name);
+
+ return 0;
+}
+
+
+static int
+model_sanity (Babl *babl,
+ void *user_data)
+{
+ /* ensure that every type has reference conversions to
+ * and from rgba */
+ void **ptr;
+ int ok;
+
+ ok = 0;
+ if (babl->model.from)
+ {
+ ptr = (void **) babl->model.from;
+
+ while (ptr && NULL!=*ptr)
+ {
+ if (babl_conversion_destination ((Babl *)(*ptr)) == (Babl*)babl_model_id (BABL_RGBA))
+ {
+ ok = 1;
+ break;
+ }
+ ptr++;
+ }
+ }
+ if (!ok)
+ babl_log ("lack of sanity! model '%s' has no conversion to 'rgba'",
+ babl->instance.name);
+
+
+ ok = 0;
+ if (babl->model.to)
+ {
+ ptr = (void **) babl->model.to;
+
+ while (ptr && NULL!=*ptr)
+ {
+ if (babl_conversion_source ((Babl *)(*ptr)) == (Babl*)babl_model_id (BABL_RGBA))
+ {
+ ok = 1;
+ break;
+ }
+ ptr++;
+ }
+ }
+ if (!ok)
+ babl_log ("lack of sanity! model '%s' has no conversion from 'rgba'",
+ babl->instance.name);
+
+ return 0;
+}
+
+static int
+id_sanity (Babl *babl,
+ void *user_data)
+{
+ if (0 == babl->instance.id)
+ {
+ babl_log ("%s\t'%s' has id==0",
+ babl_class_name (babl->instance.type), babl->instance.name);
+ }
+ return 0;
+}
+
+void
+babl_sanity (void)
+{
+ babl_type_each (id_sanity, NULL);
+ babl_component_each (id_sanity, NULL);
+ babl_model_each (id_sanity, NULL);
+ babl_pixel_format_each (id_sanity, NULL);
+
+ babl_type_each (type_sanity, NULL);
+ babl_sampling_each (foo, NULL);
+ babl_component_each (foo, NULL);
+ babl_model_each (model_sanity, NULL);
+ babl_pixel_format_each (foo, NULL);
+ babl_conversion_each (foo, NULL);
+
+
+
+}
+
+
+
+/* FIXME: these should be moved to babl-conversion.c */
+
+static Babl *babl_conversion_source (Babl *babl)
+{
+ return (Babl *)babl->conversion.source;
+}
+
+static Babl *babl_conversion_destination (Babl *babl)
+{
+ return (Babl *)babl->conversion.destination;
+}
--- /dev/null
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef _BABL_SANITY_H
+#define _BABL_SANITY_H
+
+void babl_sanity (void);
+
+#endif
--- /dev/null
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "babl-internal.h"
+#include "babl-db.h"
+
+
+#include <string.h>
+#include <stdarg.h>
+
+static int
+each_babl_type_destroy (Babl *babl,
+ void *data)
+{
+ babl_free (babl->instance.name);
+ babl_free (babl->type.from);
+ babl_free (babl->type.to);
+ babl_free (babl);
+ return 0; /* continue iterating */
+}
+
+
+static BablType *
+type_new (const char *name,
+ int id,
+ int bits)
+{
+ BablType *self;
+
+ self = babl_calloc (sizeof (BablType), 1);
+ self->instance.type = BABL_TYPE;
+ self->instance.id = id;
+ self->instance.name = babl_strdup (name);
+ self->bits = bits;
+
+ return self;
+}
+
+BablType *
+babl_type_new (const char *name,
+ ...)
+{
+ va_list varg;
+ BablType *self;
+ int id = 0;
+ int bits = 0;
+
+ const char *arg=name;
+
+ va_start (varg, name);
+
+ while (1)
+ {
+ arg = va_arg (varg, char *);
+ if (!arg)
+ break;
+
+ if (BABL_IS_BABL (arg))
+ {
+ Babl *babl = (Babl*)arg;
+
+ switch (BABL_INSTANCE_TYPE (arg))
+ {
+ case BABL_TYPE:
+ case BABL_INSTANCE:
+ case BABL_COMPONENT:
+ case BABL_MODEL:
+ case BABL_PIXEL_FORMAT:
+ case BABL_SAMPLING:
+
+ case BABL_CONVERSION:
+ case BABL_CONVERSION_TYPE:
+ case BABL_CONVERSION_TYPE_PLANAR:
+ case BABL_CONVERSION_MODEL_PLANAR:
+ case BABL_CONVERSION_PIXEL_FORMAT:
+ case BABL_CONVERSION_PIXEL_FORMAT_PLANAR:
+ case BABL_FISH:
+ babl_log ("%s(): %s unexpected",
+ __FUNCTION__, babl_class_name (babl->instance.type));
+ break;
+ case BABL_SKY: /* shut up compiler */
+ break;
+ }
+ }
+ /* if we didn't point to a babl, we assume arguments to be strings */
+ else if (!strcmp (arg, "id"))
+ {
+ id = va_arg (varg, int);
+ }
+
+ else if (!strcmp (arg, "bits"))
+ {
+ bits = va_arg (varg, int);
+ }
+
+ else
+ {
+ babl_log ("%s(): unhandled parameter '%s' for pixel_format '%s'",
+ __FUNCTION__, arg, name);
+ exit (-1);
+ }
+ }
+
+ va_end (varg);
+
+ self = type_new (name, id, bits);
+
+ if ((BablType*) db_insert ((Babl*)self) == self)
+ {
+ return self;
+ }
+ else
+ {
+ each_babl_type_destroy ((Babl*)self, NULL);
+ return NULL;
+ }
+}
+
+BABL_CLASS_TEMPLATE (BablType, babl_type, "BablType")
--- /dev/null
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef _BABL_TYPE_H
+#define _BABL_TYPE_H
+
+#include "babl-classes.h"
+BABL_DEFINE_CLASS(BablType, babl_type)
+
+#endif
--- /dev/null
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "babl-memory.h"
+
+static int list_length (void **list)
+{
+ void **ptr;
+ int len=0;
+
+ ptr = list;
+ while (NULL!=*ptr)
+ {
+ ptr++;
+ len++;
+ }
+ return len;
+}
+
+void
+babl_add_ptr_to_list (void ***list,
+ void *new)
+{
+ int orig_len=0;
+
+ if (*list)
+ {
+ orig_len = list_length (*list);
+ }
+
+ *list = babl_realloc ( (*list),
+ sizeof(void *) * (orig_len + 2));
+
+ if (!(*list))
+ {
+ fprintf (stderr, "%s(): eeek! failed to realloc", __FUNCTION__);
+ }
+
+ (*list)[orig_len]=new;
+ (*list)[orig_len+1]=NULL;
+}
+
--- /dev/null
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef _BABL_UTIL_H
+#define _BABL_UTIL_H
+
+void babl_add_ptr_to_list (void ***list,
+ void *new);
+
+#endif
--- /dev/null
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "babl.h"
+#include "babl-internal.h"
+#include "babl-base.h"
+#include "babl-sanity.h"
+#include "babl-introspect.h"
+
+void
+babl_init (void)
+{
+ babl_type_init ();
+ babl_sampling_init ();
+ babl_component_init ();
+ babl_model_init ();
+ babl_pixel_format_init ();
+ babl_conversion_init ();
+ babl_base_init ();
+
+ babl_sanity ();
+}
+
+void
+babl_destroy (void)
+{
+ /* babl_base is destroy by the containing types */
+
+ babl_conversion_destroy ();
+ babl_pixel_format_destroy ();
+ babl_model_destroy ();
+ babl_component_destroy ();
+ babl_sampling_destroy ();
+ babl_type_destroy ();
+
+ babl_memory_sanity ();
+}
--- /dev/null
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef _BABL_H
+#define _BABL_H
+
+#if __GNUC__ >=4
+ #define BABL_NULL_TERMINATED __attribute_((__sentinel__))
+#else
+ #define BABL_NULL_TERMINATED
+#endif
+
+#include <stdlib.h>
+#include "babl-classes.h"
+#include "babl-conversion.h"
+#include "babl-fish.h"
+#include "babl-model.h"
+#include "babl-ids.h"
+#include "babl-type.h"
+#include "babl-component.h"
+#include "babl-sampling.h"
+#include "babl-pixel-format.h"
+
+
+void babl_init (void);
+void babl_sanity (void);
+void babl_introspect (void);
+void babl_destroy (void);
+
+#endif
--- /dev/null
+AC_INIT(babl/babl.h)
+AM_CONFIG_HEADER(config.h)
+
+BABL_MAJOR_VERSION=0
+BABL_MINOR_VERSION=0
+BABL_MICRO_VERSION=1
+
+BABL_API_VERSION=0.0
+AC_SUBST(BABL_API_VERSION)
+
+BABL_LIBRARY_VERSION=0:0:0
+
+AC_SUBST(BABL_LIBRARY_VERSION)
+
+PACKAGE=babl
+
+BABL_VERSION=$BABL_MAJOR_VERSION.$BABL_MINOR_VERSION.$BABL_MICRO_VERSION
+BABL_RELEASE=$BABL_MAJOR_VERSION.$BABL_MINOR_VERSION
+AC_SUBST(BABL_RELEASE)
+AC_SUBST(BABL_VERSION)
+
+VERSION=$BABL_VERSION
+
+AM_INIT_AUTOMAKE($PACKAGE, $VERSION, no-define)
+
+AC_PROG_CC
+AM_PROG_LIBTOOL
+AC_STDC_HEADERS
+AM_SANITY_CHECK
+
+dnl ===========================================================================
+
+AC_OUTPUT(Makefile \
+ babl.pc \
+ babl/Makefile \
+ babl/babl-base/Makefile \
+ tests/Makefile \
+ INSTALL \
+ README
+)
--- /dev/null
+#! /bin/sh
+# depcomp - compile a program generating dependencies as side-effects
+
+scriptversion=2005-07-09.11
+
+# Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
+
+case $1 in
+ '')
+ echo "$0: No command. Try \`$0 --help' for more information." 1>&2
+ exit 1;
+ ;;
+ -h | --h*)
+ cat <<\EOF
+Usage: depcomp [--help] [--version] PROGRAM [ARGS]
+
+Run PROGRAMS ARGS to compile a file, generating dependencies
+as side-effects.
+
+Environment variables:
+ depmode Dependency tracking mode.
+ source Source file read by `PROGRAMS ARGS'.
+ object Object file output by `PROGRAMS ARGS'.
+ DEPDIR directory where to store dependencies.
+ depfile Dependency file to output.
+ tmpdepfile Temporary file to use when outputing dependencies.
+ libtool Whether libtool is used (yes/no).
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+ exit $?
+ ;;
+ -v | --v*)
+ echo "depcomp $scriptversion"
+ exit $?
+ ;;
+esac
+
+if test -z "$depmode" || test -z "$source" || test -z "$object"; then
+ echo "depcomp: Variables source, object and depmode must be set" 1>&2
+ exit 1
+fi
+
+# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
+depfile=${depfile-`echo "$object" |
+ sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
+tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
+
+rm -f "$tmpdepfile"
+
+# Some modes work just like other modes, but use different flags. We
+# parameterize here, but still list the modes in the big case below,
+# to make depend.m4 easier to write. Note that we *cannot* use a case
+# here, because this file can only contain one case statement.
+if test "$depmode" = hp; then
+ # HP compiler uses -M and no extra arg.
+ gccflag=-M
+ depmode=gcc
+fi
+
+if test "$depmode" = dashXmstdout; then
+ # This is just like dashmstdout with a different argument.
+ dashmflag=-xM
+ depmode=dashmstdout
+fi
+
+case "$depmode" in
+gcc3)
+## gcc 3 implements dependency tracking that does exactly what
+## we want. Yay! Note: for some reason libtool 1.4 doesn't like
+## it if -MD -MP comes after the -MF stuff. Hmm.
+ "$@" -MT "$object" -MD -MP -MF "$tmpdepfile"
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ mv "$tmpdepfile" "$depfile"
+ ;;
+
+gcc)
+## There are various ways to get dependency output from gcc. Here's
+## why we pick this rather obscure method:
+## - Don't want to use -MD because we'd like the dependencies to end
+## up in a subdir. Having to rename by hand is ugly.
+## (We might end up doing this anyway to support other compilers.)
+## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
+## -MM, not -M (despite what the docs say).
+## - Using -M directly means running the compiler twice (even worse
+## than renaming).
+ if test -z "$gccflag"; then
+ gccflag=-MD,
+ fi
+ "$@" -Wp,"$gccflag$tmpdepfile"
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
+## The second -e expression handles DOS-style file names with drive letters.
+ sed -e 's/^[^:]*: / /' \
+ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
+## This next piece of magic avoids the `deleted header file' problem.
+## The problem is that when a header file which appears in a .P file
+## is deleted, the dependency causes make to die (because there is
+## typically no way to rebuild the header). We avoid this by adding
+## dummy dependencies for each header file. Too bad gcc doesn't do
+## this for us directly.
+ tr ' ' '
+' < "$tmpdepfile" |
+## Some versions of gcc put a space before the `:'. On the theory
+## that the space means something, we add a space to the output as
+## well.
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly. Breaking it into two sed invocations is a workaround.
+ sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+hp)
+ # This case exists only to let depend.m4 do its work. It works by
+ # looking at the text of this script. This case will never be run,
+ # since it is checked for above.
+ exit 1
+ ;;
+
+sgi)
+ if test "$libtool" = yes; then
+ "$@" "-Wp,-MDupdate,$tmpdepfile"
+ else
+ "$@" -MDupdate "$tmpdepfile"
+ fi
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+
+ if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files
+ echo "$object : \\" > "$depfile"
+
+ # Clip off the initial element (the dependent). Don't try to be
+ # clever and replace this with sed code, as IRIX sed won't handle
+ # lines with more than a fixed number of characters (4096 in
+ # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines;
+ # the IRIX cc adds comments like `#:fec' to the end of the
+ # dependency line.
+ tr ' ' '
+' < "$tmpdepfile" \
+ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
+ tr '
+' ' ' >> $depfile
+ echo >> $depfile
+
+ # The second pass generates a dummy entry for each header file.
+ tr ' ' '
+' < "$tmpdepfile" \
+ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+ >> $depfile
+ else
+ # The sourcefile does not contain any dependencies, so just
+ # store a dummy comment line, to avoid errors with the Makefile
+ # "include basename.Plo" scheme.
+ echo "#dummy" > "$depfile"
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
+aix)
+ # The C for AIX Compiler uses -M and outputs the dependencies
+ # in a .u file. In older versions, this file always lives in the
+ # current directory. Also, the AIX compiler puts `$object:' at the
+ # start of each line; $object doesn't have directory information.
+ # Version 6 uses the directory in both cases.
+ stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'`
+ tmpdepfile="$stripped.u"
+ if test "$libtool" = yes; then
+ "$@" -Wc,-M
+ else
+ "$@" -M
+ fi
+ stat=$?
+
+ if test -f "$tmpdepfile"; then :
+ else
+ stripped=`echo "$stripped" | sed 's,^.*/,,'`
+ tmpdepfile="$stripped.u"
+ fi
+
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+
+ if test -f "$tmpdepfile"; then
+ outname="$stripped.o"
+ # Each line is of the form `foo.o: dependent.h'.
+ # Do two passes, one to just change these to
+ # `$object: dependent.h' and one to simply `dependent.h:'.
+ sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile"
+ sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile"
+ else
+ # The sourcefile does not contain any dependencies, so just
+ # store a dummy comment line, to avoid errors with the Makefile
+ # "include basename.Plo" scheme.
+ echo "#dummy" > "$depfile"
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
+icc)
+ # Intel's C compiler understands `-MD -MF file'. However on
+ # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
+ # ICC 7.0 will fill foo.d with something like
+ # foo.o: sub/foo.c
+ # foo.o: sub/foo.h
+ # which is wrong. We want:
+ # sub/foo.o: sub/foo.c
+ # sub/foo.o: sub/foo.h
+ # sub/foo.c:
+ # sub/foo.h:
+ # ICC 7.1 will output
+ # foo.o: sub/foo.c sub/foo.h
+ # and will wrap long lines using \ :
+ # foo.o: sub/foo.c ... \
+ # sub/foo.h ... \
+ # ...
+
+ "$@" -MD -MF "$tmpdepfile"
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+ # Each line is of the form `foo.o: dependent.h',
+ # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
+ # Do two passes, one to just change these to
+ # `$object: dependent.h' and one to simply `dependent.h:'.
+ sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
+ # Some versions of the HPUX 10.20 sed can't process this invocation
+ # correctly. Breaking it into two sed invocations is a workaround.
+ sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
+ sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+tru64)
+ # The Tru64 compiler uses -MD to generate dependencies as a side
+ # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
+ # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
+ # dependencies in `foo.d' instead, so we check for that too.
+ # Subdirectories are respected.
+ dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+ test "x$dir" = "x$object" && dir=
+ base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+
+ if test "$libtool" = yes; then
+ # With Tru64 cc, shared objects can also be used to make a
+ # static library. This mecanism is used in libtool 1.4 series to
+ # handle both shared and static libraries in a single compilation.
+ # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
+ #
+ # With libtool 1.5 this exception was removed, and libtool now
+ # generates 2 separate objects for the 2 libraries. These two
+ # compilations output dependencies in in $dir.libs/$base.o.d and
+ # in $dir$base.o.d. We have to check for both files, because
+ # one of the two compilations can be disabled. We should prefer
+ # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
+ # automatically cleaned when .libs/ is deleted, while ignoring
+ # the former would cause a distcleancheck panic.
+ tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4
+ tmpdepfile2=$dir$base.o.d # libtool 1.5
+ tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5
+ tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504
+ "$@" -Wc,-MD
+ else
+ tmpdepfile1=$dir$base.o.d
+ tmpdepfile2=$dir$base.d
+ tmpdepfile3=$dir$base.d
+ tmpdepfile4=$dir$base.d
+ "$@" -MD
+ fi
+
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
+ exit $stat
+ fi
+
+ for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
+ do
+ test -f "$tmpdepfile" && break
+ done
+ if test -f "$tmpdepfile"; then
+ sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+ # That's a tab and a space in the [].
+ sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+ else
+ echo "#dummy" > "$depfile"
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
+#nosideeffect)
+ # This comment above is used by automake to tell side-effect
+ # dependency tracking mechanisms from slower ones.
+
+dashmstdout)
+ # Important note: in order to support this mode, a compiler *must*
+ # always write the preprocessed file to stdout, regardless of -o.
+ "$@" || exit $?
+
+ # Remove the call to Libtool.
+ if test "$libtool" = yes; then
+ while test $1 != '--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+
+ # Remove `-o $object'.
+ IFS=" "
+ for arg
+ do
+ case $arg in
+ -o)
+ shift
+ ;;
+ $object)
+ shift
+ ;;
+ *)
+ set fnord "$@" "$arg"
+ shift # fnord
+ shift # $arg
+ ;;
+ esac
+ done
+
+ test -z "$dashmflag" && dashmflag=-M
+ # Require at least two characters before searching for `:'
+ # in the target name. This is to cope with DOS-style filenames:
+ # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
+ "$@" $dashmflag |
+ sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile"
+ rm -f "$depfile"
+ cat < "$tmpdepfile" > "$depfile"
+ tr ' ' '
+' < "$tmpdepfile" | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly. Breaking it into two sed invocations is a workaround.
+ sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+dashXmstdout)
+ # This case only exists to satisfy depend.m4. It is never actually
+ # run, as this mode is specially recognized in the preamble.
+ exit 1
+ ;;
+
+makedepend)
+ "$@" || exit $?
+ # Remove any Libtool call
+ if test "$libtool" = yes; then
+ while test $1 != '--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+ # X makedepend
+ shift
+ cleared=no
+ for arg in "$@"; do
+ case $cleared in
+ no)
+ set ""; shift
+ cleared=yes ;;
+ esac
+ case "$arg" in
+ -D*|-I*)
+ set fnord "$@" "$arg"; shift ;;
+ # Strip any option that makedepend may not understand. Remove
+ # the object too, otherwise makedepend will parse it as a source file.
+ -*|$object)
+ ;;
+ *)
+ set fnord "$@" "$arg"; shift ;;
+ esac
+ done
+ obj_suffix="`echo $object | sed 's/^.*\././'`"
+ touch "$tmpdepfile"
+ ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
+ rm -f "$depfile"
+ cat < "$tmpdepfile" > "$depfile"
+ sed '1,2d' "$tmpdepfile" | tr ' ' '
+' | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly. Breaking it into two sed invocations is a workaround.
+ sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile" "$tmpdepfile".bak
+ ;;
+
+cpp)
+ # Important note: in order to support this mode, a compiler *must*
+ # always write the preprocessed file to stdout.
+ "$@" || exit $?
+
+ # Remove the call to Libtool.
+ if test "$libtool" = yes; then
+ while test $1 != '--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+
+ # Remove `-o $object'.
+ IFS=" "
+ for arg
+ do
+ case $arg in
+ -o)
+ shift
+ ;;
+ $object)
+ shift
+ ;;
+ *)
+ set fnord "$@" "$arg"
+ shift # fnord
+ shift # $arg
+ ;;
+ esac
+ done
+
+ "$@" -E |
+ sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
+ sed '$ s: \\$::' > "$tmpdepfile"
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ cat < "$tmpdepfile" >> "$depfile"
+ sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+msvisualcpp)
+ # Important note: in order to support this mode, a compiler *must*
+ # always write the preprocessed file to stdout, regardless of -o,
+ # because we must use -o when running libtool.
+ "$@" || exit $?
+ IFS=" "
+ for arg
+ do
+ case "$arg" in
+ "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
+ set fnord "$@"
+ shift
+ shift
+ ;;
+ *)
+ set fnord "$@" "$arg"
+ shift
+ shift
+ ;;
+ esac
+ done
+ "$@" -E |
+ sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile"
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile"
+ echo " " >> "$depfile"
+ . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+none)
+ exec "$@"
+ ;;
+
+*)
+ echo "Unknown depmode $depmode" 1>&2
+ exit 1
+ ;;
+esac
+
+exit 0
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
--- /dev/null
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2005-05-14.22
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch. It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+chmodcmd="$chmodprog 0755"
+chowncmd=
+chgrpcmd=
+stripcmd=
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=
+dst=
+dir_arg=
+dstarg=
+no_target_directory=
+
+usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+ or: $0 [OPTION]... SRCFILES... DIRECTORY
+ or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+ or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+-c (ignored)
+-d create directories instead of installing files.
+-g GROUP $chgrpprog installed files to GROUP.
+-m MODE $chmodprog installed files to MODE.
+-o USER $chownprog installed files to USER.
+-s $stripprog installed files.
+-t DIRECTORY install into DIRECTORY.
+-T report an error if DSTFILE is a directory.
+--help display this help and exit.
+--version display version info and exit.
+
+Environment variables override the default commands:
+ CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
+"
+
+while test -n "$1"; do
+ case $1 in
+ -c) shift
+ continue;;
+
+ -d) dir_arg=true
+ shift
+ continue;;
+
+ -g) chgrpcmd="$chgrpprog $2"
+ shift
+ shift
+ continue;;
+
+ --help) echo "$usage"; exit $?;;
+
+ -m) chmodcmd="$chmodprog $2"
+ shift
+ shift
+ continue;;
+
+ -o) chowncmd="$chownprog $2"
+ shift
+ shift
+ continue;;
+
+ -s) stripcmd=$stripprog
+ shift
+ continue;;
+
+ -t) dstarg=$2
+ shift
+ shift
+ continue;;
+
+ -T) no_target_directory=true
+ shift
+ continue;;
+
+ --version) echo "$0 $scriptversion"; exit $?;;
+
+ *) # When -d is used, all remaining arguments are directories to create.
+ # When -t is used, the destination is already specified.
+ test -n "$dir_arg$dstarg" && break
+ # Otherwise, the last argument is the destination. Remove it from $@.
+ for arg
+ do
+ if test -n "$dstarg"; then
+ # $@ is not empty: it contains at least $arg.
+ set fnord "$@" "$dstarg"
+ shift # fnord
+ fi
+ shift # arg
+ dstarg=$arg
+ done
+ break;;
+ esac
+done
+
+if test -z "$1"; then
+ if test -z "$dir_arg"; then
+ echo "$0: no input file specified." >&2
+ exit 1
+ fi
+ # It's OK to call `install-sh -d' without argument.
+ # This can happen when creating conditional directories.
+ exit 0
+fi
+
+for src
+do
+ # Protect names starting with `-'.
+ case $src in
+ -*) src=./$src ;;
+ esac
+
+ if test -n "$dir_arg"; then
+ dst=$src
+ src=
+
+ if test -d "$dst"; then
+ mkdircmd=:
+ chmodcmd=
+ else
+ mkdircmd=$mkdirprog
+ fi
+ else
+ # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+ # might cause directories to be created, which would be especially bad
+ # if $src (and thus $dsttmp) contains '*'.
+ if test ! -f "$src" && test ! -d "$src"; then
+ echo "$0: $src does not exist." >&2
+ exit 1
+ fi
+
+ if test -z "$dstarg"; then
+ echo "$0: no destination specified." >&2
+ exit 1
+ fi
+
+ dst=$dstarg
+ # Protect names starting with `-'.
+ case $dst in
+ -*) dst=./$dst ;;
+ esac
+
+ # If destination is a directory, append the input filename; won't work
+ # if double slashes aren't ignored.
+ if test -d "$dst"; then
+ if test -n "$no_target_directory"; then
+ echo "$0: $dstarg: Is a directory" >&2
+ exit 1
+ fi
+ dst=$dst/`basename "$src"`
+ fi
+ fi
+
+ # This sed command emulates the dirname command.
+ dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'`
+
+ # Make sure that the destination directory exists.
+
+ # Skip lots of stat calls in the usual case.
+ if test ! -d "$dstdir"; then
+ defaultIFS='
+ '
+ IFS="${IFS-$defaultIFS}"
+
+ oIFS=$IFS
+ # Some sh's can't handle IFS=/ for some reason.
+ IFS='%'
+ set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
+ shift
+ IFS=$oIFS
+
+ pathcomp=
+
+ while test $# -ne 0 ; do
+ pathcomp=$pathcomp$1
+ shift
+ if test ! -d "$pathcomp"; then
+ $mkdirprog "$pathcomp"
+ # mkdir can fail with a `File exist' error in case several
+ # install-sh are creating the directory concurrently. This
+ # is OK.
+ test -d "$pathcomp" || exit
+ fi
+ pathcomp=$pathcomp/
+ done
+ fi
+
+ if test -n "$dir_arg"; then
+ $doit $mkdircmd "$dst" \
+ && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \
+ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \
+ && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \
+ && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; }
+
+ else
+ dstfile=`basename "$dst"`
+
+ # Make a couple of temp file names in the proper directory.
+ dsttmp=$dstdir/_inst.$$_
+ rmtmp=$dstdir/_rm.$$_
+
+ # Trap to clean up those temp files at exit.
+ trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+ trap '(exit $?); exit' 1 2 13 15
+
+ # Copy the file name to the temp name.
+ $doit $cpprog "$src" "$dsttmp" &&
+
+ # and set any options; do chmod last to preserve setuid bits.
+ #
+ # If any of these fail, we abort the whole thing. If we want to
+ # ignore errors from any of these, just make sure not to ignore
+ # errors from the above "$doit $cpprog $src $dsttmp" command.
+ #
+ { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
+ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
+ && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
+ && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } &&
+
+ # Now rename the file to the real destination.
+ { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \
+ || {
+ # The rename failed, perhaps because mv can't rename something else
+ # to itself, or perhaps because mv is so ancient that it does not
+ # support -f.
+
+ # Now remove or move aside any old file at destination location.
+ # We try this two ways since rm can't unlink itself on some
+ # systems and the destination file might be busy for other
+ # reasons. In this case, the final cleanup might fail but the new
+ # file should still install successfully.
+ {
+ if test -f "$dstdir/$dstfile"; then
+ $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \
+ || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \
+ || {
+ echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
+ (exit 1); exit 1
+ }
+ else
+ :
+ fi
+ } &&
+
+ # Now rename the file to the real destination.
+ $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
+ }
+ }
+ fi || { (exit 1); exit 1; }
+done
+
+# The final little trick to "correctly" pass the exit status to the exit trap.
+{
+ (exit 0); exit 0
+}
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
--- /dev/null
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+
+scriptversion=2005-06-08.21
+
+# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+if test $# -eq 0; then
+ echo 1>&2 "Try \`$0 --help' for more information"
+ exit 1
+fi
+
+run=:
+
+# In the cases where this matters, `missing' is being run in the
+# srcdir already.
+if test -f configure.ac; then
+ configure_ac=configure.ac
+else
+ configure_ac=configure.in
+fi
+
+msg="missing on your system"
+
+case "$1" in
+--run)
+ # Try to run requested program, and just exit if it succeeds.
+ run=
+ shift
+ "$@" && exit 0
+ # Exit code 63 means version mismatch. This often happens
+ # when the user try to use an ancient version of a tool on
+ # a file that requires a minimum version. In this case we
+ # we should proceed has if the program had been absent, or
+ # if --run hadn't been passed.
+ if test $? = 63; then
+ run=:
+ msg="probably too old"
+ fi
+ ;;
+
+ -h|--h|--he|--hel|--help)
+ echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+ -h, --help display this help and exit
+ -v, --version output version information and exit
+ --run try to run the given command, and emulate it if it fails
+
+Supported PROGRAM values:
+ aclocal touch file \`aclocal.m4'
+ autoconf touch file \`configure'
+ autoheader touch file \`config.h.in'
+ automake touch all \`Makefile.in' files
+ bison create \`y.tab.[ch]', if possible, from existing .[ch]
+ flex create \`lex.yy.c', if possible, from existing .c
+ help2man touch the output file
+ lex create \`lex.yy.c', if possible, from existing .c
+ makeinfo touch the output file
+ tar try tar, gnutar, gtar, then tar without non-portable flags
+ yacc create \`y.tab.[ch]', if possible, from existing .[ch]
+
+Send bug reports to <bug-automake@gnu.org>."
+ exit $?
+ ;;
+
+ -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+ echo "missing $scriptversion (GNU Automake)"
+ exit $?
+ ;;
+
+ -*)
+ echo 1>&2 "$0: Unknown \`$1' option"
+ echo 1>&2 "Try \`$0 --help' for more information"
+ exit 1
+ ;;
+
+esac
+
+# Now exit if we have it, but it failed. Also exit now if we
+# don't have it and --version was passed (most likely to detect
+# the program).
+case "$1" in
+ lex|yacc)
+ # Not GNU programs, they don't have --version.
+ ;;
+
+ tar)
+ if test -n "$run"; then
+ echo 1>&2 "ERROR: \`tar' requires --run"
+ exit 1
+ elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+ exit 1
+ fi
+ ;;
+
+ *)
+ if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+ # We have it, but it failed.
+ exit 1
+ elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+ # Could not run --version or --help. This is probably someone
+ # running `$TOOL --version' or `$TOOL --help' to check whether
+ # $TOOL exists and not knowing $TOOL uses missing.
+ exit 1
+ fi
+ ;;
+esac
+
+# If it does not exist, or fails to run (possibly an outdated version),
+# try to emulate it.
+case "$1" in
+ aclocal*)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`acinclude.m4' or \`${configure_ac}'. You might want
+ to install the \`Automake' and \`Perl' packages. Grab them from
+ any GNU archive site."
+ touch aclocal.m4
+ ;;
+
+ autoconf)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`${configure_ac}'. You might want to install the
+ \`Autoconf' and \`GNU m4' packages. Grab them from any GNU
+ archive site."
+ touch configure
+ ;;
+
+ autoheader)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`acconfig.h' or \`${configure_ac}'. You might want
+ to install the \`Autoconf' and \`GNU m4' packages. Grab them
+ from any GNU archive site."
+ files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
+ test -z "$files" && files="config.h"
+ touch_files=
+ for f in $files; do
+ case "$f" in
+ *:*) touch_files="$touch_files "`echo "$f" |
+ sed -e 's/^[^:]*://' -e 's/:.*//'`;;
+ *) touch_files="$touch_files $f.in";;
+ esac
+ done
+ touch $touch_files
+ ;;
+
+ automake*)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
+ You might want to install the \`Automake' and \`Perl' packages.
+ Grab them from any GNU archive site."
+ find . -type f -name Makefile.am -print |
+ sed 's/\.am$/.in/' |
+ while read f; do touch "$f"; done
+ ;;
+
+ autom4te)
+ echo 1>&2 "\
+WARNING: \`$1' is needed, but is $msg.
+ You might have modified some files without having the
+ proper tools for further handling them.
+ You can get \`$1' as part of \`Autoconf' from any GNU
+ archive site."
+
+ file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'`
+ test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'`
+ if test -f "$file"; then
+ touch $file
+ else
+ test -z "$file" || exec >$file
+ echo "#! /bin/sh"
+ echo "# Created by GNU Automake missing as a replacement of"
+ echo "# $ $@"
+ echo "exit 0"
+ chmod +x $file
+ exit 1
+ fi
+ ;;
+
+ bison|yacc)
+ echo 1>&2 "\
+WARNING: \`$1' $msg. You should only need it if
+ you modified a \`.y' file. You may need the \`Bison' package
+ in order for those modifications to take effect. You can get
+ \`Bison' from any GNU archive site."
+ rm -f y.tab.c y.tab.h
+ if [ $# -ne 1 ]; then
+ eval LASTARG="\${$#}"
+ case "$LASTARG" in
+ *.y)
+ SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" y.tab.c
+ fi
+ SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" y.tab.h
+ fi
+ ;;
+ esac
+ fi
+ if [ ! -f y.tab.h ]; then
+ echo >y.tab.h
+ fi
+ if [ ! -f y.tab.c ]; then
+ echo 'main() { return 0; }' >y.tab.c
+ fi
+ ;;
+
+ lex|flex)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified a \`.l' file. You may need the \`Flex' package
+ in order for those modifications to take effect. You can get
+ \`Flex' from any GNU archive site."
+ rm -f lex.yy.c
+ if [ $# -ne 1 ]; then
+ eval LASTARG="\${$#}"
+ case "$LASTARG" in
+ *.l)
+ SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" lex.yy.c
+ fi
+ ;;
+ esac
+ fi
+ if [ ! -f lex.yy.c ]; then
+ echo 'main() { return 0; }' >lex.yy.c
+ fi
+ ;;
+
+ help2man)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified a dependency of a manual page. You may need the
+ \`Help2man' package in order for those modifications to take
+ effect. You can get \`Help2man' from any GNU archive site."
+
+ file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+ if test -z "$file"; then
+ file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'`
+ fi
+ if [ -f "$file" ]; then
+ touch $file
+ else
+ test -z "$file" || exec >$file
+ echo ".ab help2man is required to generate this page"
+ exit 1
+ fi
+ ;;
+
+ makeinfo)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified a \`.texi' or \`.texinfo' file, or any other file
+ indirectly affecting the aspect of the manual. The spurious
+ call might also be the consequence of using a buggy \`make' (AIX,
+ DU, IRIX). You might want to install the \`Texinfo' package or
+ the \`GNU make' package. Grab either from any GNU archive site."
+ # The file to touch is that specified with -o ...
+ file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+ if test -z "$file"; then
+ # ... or it is the one specified with @setfilename ...
+ infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+ file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $infile`
+ # ... or it is derived from the source name (dir/f.texi becomes f.info)
+ test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
+ fi
+ # If the file does not exist, the user really needs makeinfo;
+ # let's fail without touching anything.
+ test -f $file || exit 1
+ touch $file
+ ;;
+
+ tar)
+ shift
+
+ # We have already tried tar in the generic part.
+ # Look for gnutar/gtar before invocation to avoid ugly error
+ # messages.
+ if (gnutar --version > /dev/null 2>&1); then
+ gnutar "$@" && exit 0
+ fi
+ if (gtar --version > /dev/null 2>&1); then
+ gtar "$@" && exit 0
+ fi
+ firstarg="$1"
+ if shift; then
+ case "$firstarg" in
+ *o*)
+ firstarg=`echo "$firstarg" | sed s/o//`
+ tar "$firstarg" "$@" && exit 0
+ ;;
+ esac
+ case "$firstarg" in
+ *h*)
+ firstarg=`echo "$firstarg" | sed s/h//`
+ tar "$firstarg" "$@" && exit 0
+ ;;
+ esac
+ fi
+
+ echo 1>&2 "\
+WARNING: I can't seem to be able to run \`tar' with the given arguments.
+ You may want to install GNU tar or Free paxutils, or check the
+ command line arguments."
+ exit 1
+ ;;
+
+ *)
+ echo 1>&2 "\
+WARNING: \`$1' is needed, and is $msg.
+ You might have modified some files without having the
+ proper tools for further handling them. Check the \`README' file,
+ it often tells you about the needed prerequisites for installing
+ this package. You may also peek at any GNU archive site, in case
+ some other package would contain this missing \`$1' program."
+ exit 1
+ ;;
+esac
+
+exit 0
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
--- /dev/null
+Makefile
+Makefile.in
+nop
+introspect
+
--- /dev/null
+noinst_PROGRAMS = \
+ introspect \
+ nop
+
+AM_CFLAGS = -I$(top_srcdir) -I$(top_srcdir)/babl
+
+introspect_SOURCES = \
+ introspect.c
+introspect_LDADD = $(top_builddir)/babl/libbabl.la
+
+nop_SOURCES = \
+ nop.c
+nop_LDADD = $(top_builddir)/babl/libbabl.la
+
+EXTRA_DIST= \
+ .cvsignore
--- /dev/null
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "babl.h"
+#include "babl-internal.h"
+
+int
+main (int argc,
+ char **argv)
+{
+ babl_init ();
+ babl_introspect ();
+ babl_destroy ();
+ return 0;
+}
--- /dev/null
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, Øyvind Kolås.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "babl.h"
+#include "babl-internal.h"
+
+int
+main (int argc,
+ char **argv)
+{
+ babl_init ();
+ babl_destroy ();
+ return 0;
+}